Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用批处理从字符串中提取子字符串_Batch File_Regex Group - Fatal编程技术网

Batch file 使用批处理从字符串中提取子字符串

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) {

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

我有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) {
    $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。