String 批量使用左右边界提取字符串

String 批量使用左右边界提取字符串,string,perl,batch-file,vbscript,String,Perl,Batch File,Vbscript,我试图从一个字符串中获取一个值,该字符串的左边界为测试/时间(ms)=,右边界为,测试/状态为0 例如,如果我有一个如下所示的输入字符串: input="test/ing=123, hello/world=321, test/time (ms)=100, test/status=0" 在Perl中,我知道我可以执行以下操作: input=~/"test/time (ms)="(.*)", test/status=0"/; $time=$1; $time将保存我想要获取的值 不幸的是,我只能用

我试图从一个字符串中获取一个值,该字符串的左边界为
测试/时间(ms)=
,右边界为
,测试/状态为0

例如,如果我有一个如下所示的输入字符串:

input="test/ing=123, hello/world=321, test/time (ms)=100, test/status=0"
在Perl中,我知道我可以执行以下操作:

input=~/"test/time (ms)="(.*)", test/status=0"/;
$time=$1;
$time
将保存我想要获取的值

不幸的是,我只能用Windows批处理或VBScript编写代码。有人知道batch如何执行与Perl中相同的操作吗?

VBScript/RegExp:

>> input="test/ing=123, hello/world=321, test/time (ms)=100, test/status=0"
>> set r = New RegExp
>> r.Pattern = "\(ms\)=(\d+),"
>> WScript.Echo r.Execute(input)(0).Submatches(0)
>>
100
VBScript/RegExp:

>> input="test/ing=123, hello/world=321, test/time (ms)=100, test/status=0"
>> set r = New RegExp
>> r.Pattern = "\(ms\)=(\d+),"
>> WScript.Echo r.Execute(input)(0).Submatches(0)
>>
100
批处理文件:

SET input="test/ing=123, hello/world=321, test/time (ms)=100, test/status=0"
FOR %%i IN (%input:, =" "%) DO FOR /F "TOKENS=1,* DELIMS==" %%j IN (%%i) DO IF "%%j" == "test/time (ms)" ECHO %%k
编辑:解释

%input:,=“”%
返回
测试/ing=123“hello/world=321”测试/时间(ms)=100“测试/状态=0”

的外部
将为上一个结果中的每个字符串分配
%%i

的内部
=
左侧的字符分配给
%%j
,右侧的字符分配给
%%k

然后将
%%j
与所需的键进行比较,如果匹配,则显示值。

批处理文件:

SET input="test/ing=123, hello/world=321, test/time (ms)=100, test/status=0"
FOR %%i IN (%input:, =" "%) DO FOR /F "TOKENS=1,* DELIMS==" %%j IN (%%i) DO IF "%%j" == "test/time (ms)" ECHO %%k
编辑:解释

%input:,=“”%
返回
测试/ing=123“hello/world=321”测试/时间(ms)=100“测试/状态=0”

的外部
将为上一个结果中的每个字符串分配
%%i

的内部
=
左侧的字符分配给
%%j
,右侧的字符分配给
%%k


然后将
%%j
与所需的键进行比较,如果匹配,则显示值。

纯批处理:

for /f "delims==," %%A in ("%input:*test/time (ms)=%) do echo %%A
IN子句中的搜索和替换查找第一次出现的
test/time(ms)
,并从原始字符串的开头到搜索字符串的结尾进行替换,不包含任何内容。FOR/F然后使用分隔符
=
解析出100

%input%
的值中包含的引号会导致IN()子句看起来很奇怪,没有可见的结束引号

延迟扩展看起来更好:

setlocal enableDelayedExpansion
for /f "delims==," %%A in ("!input:*test/time (ms)=!") do echo %%A
我更喜欢将引号保留在变量值之外,并根据需要显式地将它们添加到代码中。这使正常扩展版本看起来更自然(延迟扩展版本保持不变):

借助JScript进行批处理

如果您有my,那么您可以在解析过程中使用regex非常具体:

call repl ".*test/time \(ms\)=(.*?),.*" $1 sa input
要获取变量中的值,请执行以下操作:

set "val="
for /f "delims=" %%A in ('repl ".*test/time \(ms\)=(.*?),.*" $1 sa input') do set "val=%%A"

注意,IN()子句中不需要调用。使用管道时也不需要它。

纯批次:

for /f "delims==," %%A in ("%input:*test/time (ms)=%) do echo %%A
IN子句中的搜索和替换查找第一次出现的
test/time(ms)
,并从原始字符串的开头到搜索字符串的结尾进行替换,不包含任何内容。FOR/F然后使用分隔符
=
解析出100

%input%
的值中包含的引号会导致IN()子句看起来很奇怪,没有可见的结束引号

延迟扩展看起来更好:

setlocal enableDelayedExpansion
for /f "delims==," %%A in ("!input:*test/time (ms)=!") do echo %%A
我更喜欢将引号保留在变量值之外,并根据需要显式地将它们添加到代码中。这使正常扩展版本看起来更自然(延迟扩展版本保持不变):

借助JScript进行批处理

如果您有my,那么您可以在解析过程中使用regex非常具体:

call repl ".*test/time \(ms\)=(.*?),.*" $1 sa input
要获取变量中的值,请执行以下操作:

set "val="
for /f "delims=" %%A in ('repl ".*test/time \(ms\)=(.*?),.*" $1 sa input') do set "val=%%A"

注意,IN()子句中不需要调用。使用管道时也不需要它。

find single
perl.exe
executable(xampp for windows有一个)对不起。我不明白你的意思。它如何帮助将脚本更改为批处理文件格式?使用perl,您不必进行任何转换;)是的,但我不会使用perl。我只能使用vb脚本或批处理脚本:(查找单个
perl.exe
可执行文件(xampp for windows有一个)对不起。我不明白你的意思。它对将脚本更改为批处理文件格式有什么帮助?使用perl不必进行任何转换;)是的,但我不能使用perl。我只能使用vb脚本或批处理脚本:(只是想知道…您是如何将%%k分配给右边的,将%%j分配给左边的?
FOR/F“TOKENS=1,*DELIMS==”…
!在命令行中键入
FOR/?
并查看
文档。只是想知道…您是如何将%%k分配给右边的,将%%j分配给左边的?
FOR/F“TOKENS=1,*DELIMS==”…
!在命令行中键入
以获取/?
,然后检查
以获取
文档。