我需要的是列表中数字的第一个序列:
命令:
for /f "delims=" %%a in (notas.txt) do @echo %%a返回:
Compra cfme NF 12345 de 123 CIA ABC
Pgto dupl. 12345 - 123 CIA ABC
Compra cfme NFS 654321-CIA CBC
Pgto NF 654321 de CIA CBC但我需要的是:
12345
12345
654321
654321提前感谢
发布于 2019-10-28 00:34:16
有许多PowerShell解决方案/技术可以执行所需的任务。
switch语句可以与-File和-Regex参数一起使用。
switch -Regex -File notas.txt {
'\d+' { $Matches[0] }
}您还可以使用regex类中的Match方法:
Get-Content notas.txt | Foreach-Object {
[regex]::Match($_,'\d+').Value
}这两种解决方案都依赖于正则表达式匹配,其中\d+匹配一个或多个连续的数字。因为我们每行只进行一次匹配,所以第一个匹配是唯一返回的匹配。正则表达式类方法Matches为每个字符串输入返回多个匹配项。
发布于 2019-10-28 02:50:54
对于在VBScript中使用正则表达式的批处理文件,您可以执行如下操作:Demo Here
@echo off & color 0A
Title Extract Numbers from String using Regex with vbscript
Set "InputFile=%~dp0notas.txt"
Set "OutPutFile=%~n0_OutPutFile.txt"
Call :Extract_Number "%InputFile%" CON
Call :Extract_Number "%InputFile%" "%OutPutFile%"
TimeOut /T 3 /NoBreak>nul
If Exist "%OutPutFile%" Start "" "%OutPutFile%" & Exit
::-----------------------------------------------------------------------------------
:Extract_Number <Input> <OutPut>
(
echo WScript.StdOut.WriteLine Extract_Number(Data^)
echo Function Extract_Number(Data^)
echo Data = "%~1"
echo Data = WScript.StdIn.ReadAll
echo Set re = New RegExp
echo re.Global = True
echo re.IgnoreCase = True
echo re.Pattern = "\d{5,}"
echo For Each Match in re.Execute(Data^)
echo Number = Number ^& Match.Value ^& vbCrLF
echo Next
echo Extract_Number = Number
echo End Function
)>"%tmp%\%~n0.vbs"
cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
Exit /B
::----------------------------------------------------------------------------------发布于 2019-10-28 06:20:20
第一个代码做了您的问题所要求的,但不是您预期的结果:
@echo off
:: Pass the entire line to a subroutine
for /f "delims=" %%a in (notas.txt) do call :process %%a
goto :eof
:process
:: Check if we've evaluated the entire line
if "%1"=="" (
echo No number was found in this line
goto :eof
)
:: Check if the current parameter is only numbers
:: If it is, then echo and move on to the next line
:: If not, use shift to evaluate the next parameter
echo %1|findstr /i /r "[^0-9]" >nul && shift && goto :process
echo %1
goto :eof两件事。首先,如果在行中找不到数字,我不知道你想要做什么。在上面的代码中,我只是回显了“在这一行没有找到数字”。
其次,我假定“数字”完全由标准空格作为分隔符。因此,上面的代码不会从Compra cfme NFS 654321-CIA CBC行返回654321,因为654321-CIA不是由空格分隔的数字。如果需要其他分隔符,请更改上面的行:
for /f "delims=" %%a in (notas.txt) do call :process %%a至:
for /f "tokens=1-10 delims=-., " %%a in (notas.txt) do call :process %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j添加您想要的任何分隔符(不要忘记双引号前的空格)。在给定行上,此行最多支持10个条目。通过%%z使用tokens=1-26和%%a到26是相当容易的。
最后--如果你想拉取一个无分隔符的数字--那将是一种完全不同的方法。一个例子是从PC1356 NLA LOA获取1356;或者从PC LI-D 35232NDA TTH获取35232。
https://stackoverflow.com/questions/58581176
复制相似问题