使用Batch从字符串中提取子字符串

时间:2017-12-06 12:55:01

标签: batch-file regex-group

我需要使用批处理文件从字符串中提取子字符串(带下划线的数字)。例如:

我有AbC_d1344_454_78a。 要么  Deg_e23_74_67。

我想提取子串1344_454_78和23_74_67。

3 个答案:

答案 0 :(得分:2)

您有一些批处理文件的解决方案。

如果您的数据总是与数字前的字符数量相同,则可以使用简单的子字符串来提取字符串的一部分。所以这会从字符串中删除前五个字符。

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命令对其进行测试并去除前导和/或尾随字母字符。

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%"

如果您有多个前导和尾随字母字符,则可以使用标签和goto继续迭代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)

根据需要交换任何代码示例。

答案 1 :(得分:0)

另一个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来试验正则表达式。

答案 2 :(得分:-1)

使用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()
} 

这会搜索一个数字,后跟任意数量的数字或下划线