使用批处理从字符串中提取子字符串
Extract Substring from string using Batch
我需要使用批处理文件从字符串中提取子字符串(带下划线的数字)。例如:
我有AbC_d1344_454_78a。
或者
Deg_e23_74_67.
我想提取子字符串 1344_454_78 和 23_74_67。
使用 powershell 你可以使用
$regex = [regex] '(?m)\d[\d_]*'
$matchdetails = $regex.Match("AbC_d1344_454_78a. or Deg_e23_74_67")
while ($matchdetails.Success) {
$matchdetails.Value
$matchdetails = $matchdetails.NextMatch()
}
这将搜索后跟任意数量的数字或下划线的数字
另一个Powershell
$entries = @('AbC_d1344_454_78a', 'Deg_e23_74_67') #example
$entries | %{[System.Text.RegularExpressions.Regex]::Match($_, '(\d[\d_]+\d)').Value}
根据输入数据的格式,您可能希望使用或多或少严格的正则表达式,例如(\d[\d_]*)
或更具体的内容。我建议使用 http://regexr.com 来试验正则表达式。
您有几个带有批处理文件的解决方案。
如果您的数据在数字之前总是有相同数量的字符,您可以做一个简单的子字符串来提取字符串的一部分。所以这会从字符串中删除前五个字符。
SET "VAR=AbC_d1344_454_78a"
SET "VAR=%VAR:~5%"
但此时您的结尾仍然是字母字符。因此,您可以执行一个简单的 findstr 命令来查看末尾是否有字母字符,如果有,您可以用另一个子字符串再次剥离它以删除最后一个字符。
SET "var=AbC_d1344_454_78a"
SET "var=%var:~5%"
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%"
另一种选择是使用 FOR /F 命令并利用 DELIMS 选项通过使用下划线作为分隔符将字符串分解为单独的变量。你可以得到第一个下划线之后的所有内容,分配给这样的变量。
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
但又一次,您现在有一个前导和尾随字母字符。同样,您可以使用 FINDSTR 命令对其进行测试并去除前导 and/or 尾随字母字符。
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
echo %var%|findstr /R /I /C:"^[a-z]">nul &&SET "var=%var:~1%"
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%"
如果您有多个前导和尾随字母字符,您可以使用标签和转到来继续迭代 FINDSTR 命令。
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
:leading
echo %var%|findstr /R /I /C:"^[a-z]">nul &&(SET "var=%var:~1%" &GOTO leading)
:trailing
echo %var%|findstr /R /I /C:"[a-z]$">nul &&(SET "var=%var:~0,-1%" &GOTO trailing)
根据需要交换任何代码示例。
我需要使用批处理文件从字符串中提取子字符串(带下划线的数字)。例如:
我有AbC_d1344_454_78a。 或者 Deg_e23_74_67.
我想提取子字符串 1344_454_78 和 23_74_67。
使用 powershell 你可以使用
$regex = [regex] '(?m)\d[\d_]*'
$matchdetails = $regex.Match("AbC_d1344_454_78a. or Deg_e23_74_67")
while ($matchdetails.Success) {
$matchdetails.Value
$matchdetails = $matchdetails.NextMatch()
}
这将搜索后跟任意数量的数字或下划线的数字
另一个Powershell
$entries = @('AbC_d1344_454_78a', 'Deg_e23_74_67') #example
$entries | %{[System.Text.RegularExpressions.Regex]::Match($_, '(\d[\d_]+\d)').Value}
根据输入数据的格式,您可能希望使用或多或少严格的正则表达式,例如(\d[\d_]*)
或更具体的内容。我建议使用 http://regexr.com 来试验正则表达式。
您有几个带有批处理文件的解决方案。
如果您的数据在数字之前总是有相同数量的字符,您可以做一个简单的子字符串来提取字符串的一部分。所以这会从字符串中删除前五个字符。
SET "VAR=AbC_d1344_454_78a"
SET "VAR=%VAR:~5%"
但此时您的结尾仍然是字母字符。因此,您可以执行一个简单的 findstr 命令来查看末尾是否有字母字符,如果有,您可以用另一个子字符串再次剥离它以删除最后一个字符。
SET "var=AbC_d1344_454_78a"
SET "var=%var:~5%"
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%"
另一种选择是使用 FOR /F 命令并利用 DELIMS 选项通过使用下划线作为分隔符将字符串分解为单独的变量。你可以得到第一个下划线之后的所有内容,分配给这样的变量。
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
但又一次,您现在有一个前导和尾随字母字符。同样,您可以使用 FINDSTR 命令对其进行测试并去除前导 and/or 尾随字母字符。
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
echo %var%|findstr /R /I /C:"^[a-z]">nul &&SET "var=%var:~1%"
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%"
如果您有多个前导和尾随字母字符,您可以使用标签和转到来继续迭代 FINDSTR 命令。
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
:leading
echo %var%|findstr /R /I /C:"^[a-z]">nul &&(SET "var=%var:~1%" &GOTO leading)
:trailing
echo %var%|findstr /R /I /C:"[a-z]$">nul &&(SET "var=%var:~0,-1%" &GOTO trailing)
根据需要交换任何代码示例。