Batch file 使用批处理从字符串中提取子字符串
我需要使用批处理文件从字符串中提取子字符串(带下划线的数字)。例如: 我有AbC_d1344_454_78a。 或 度e23度74度67度Batch file 使用批处理从字符串中提取子字符串,batch-file,regex-group,Batch File,Regex Group,我需要使用批处理文件从字符串中提取子字符串(带下划线的数字)。例如: 我有AbC_d1344_454_78a。 或 度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) {
我想提取子字符串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}
根据输入数据的格式,您可能希望转到更严格或更严格的regexp,例如
(\d[\d\]*)
或更具体的内容。我建议您使用regexp进行实验。您有两个解决方案,其中一个是批处理文件
如果数据总是在数字之前包含相同数量的字符,则可以使用简单的子字符串提取部分字符串。因此,这将从字符串中删除前五个字符
SET "VAR=AbC_d1344_454_78a"
SET "VAR=%VAR:~5%"
但在这一点上,你仍然有阿尔法字符的结尾。因此,您可以执行一个简单的findstr命令,查看末尾是否有alpha字符,如果有,您可以使用另一个子字符串再次剥离它以删除最后一个字符
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 "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%"
另一个选项是使用FOR/F命令,并利用DELIMS选项通过使用下划线作为分隔符将字符串拆分为单独的变量。在将第一个下划线指定给这样的变量之后,您可以获得所有内容
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
但再一次,您现在有了一个前导和尾随的alpha字符。同样,您可以使用FINDSTR命令来测试它,并去除前导和/或尾随的alpha字符
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 "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)
根据需要交换任意代码示例。为什么在本文档中标记了PS?您期望的是一个批处理解决方案,对吗?实际上是两行批处理代码。阅读for命令的帮助并使用/F选项。第一个示例有尾随字母,但第二个示例没有。我们应该从字符串中去掉任何前导或尾随的字母字符吗?@Squashman-如果你能用两行批处理代码正确处理这个问题,你应该发布一个答案。“我会投你一票的。”壁球手:后面可能有一封信。实际上,我需要从文件名中提取版本号,版本号后面可以有尾随字符。@RandipDutta Powershell解决方案也可以help@RanadipDutta-不,他不是。InCorrigible1已删除Powershell标记。@RanadipDutta-为什么要删除Powershell标记?OP明确指出Powershell解决方案也有帮助?(你是否因此否决了投票?)因为他正在寻找批量解决方案建议者:
for/F“tokens=2 delims=abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz”%%a in(“AbC_d1344_454_78a”)do echo%%a
。。。就这样。投了赞成票,但我会坚持使用Powershell。