0

我正在尝试从具有左边界test/time (ms)=和右边界的字符串中获取值, test/status=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 Batch 或 VBScript 编写代码。有谁知道批处理如何执行与 Perl 中相同的操作?

4

3 回答 3

2

纯批次:

for /f "delims==," %%A in ("%input:*test/time (ms)=%) do echo %%A

IN 子句中的搜索和替换查找第一次出现的test/time (ms)并从原始字符串的开头替换到搜索字符串的结尾,没有任何内容。=FOR /F 然后使用and的分隔符解析出 100 ,

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

延迟扩展看起来更好:

setlocal enableDelayedExpansion
for /f "delims==," %%A in ("!input:*test/time (ms)=!") do echo %%A

我更喜欢在我的变量值中保留引号,并根据需要将它们显式添加到我的代码中。这使得普通扩展版本看起来更自然(延迟扩展版本保持不变):

set "input=test/ing=123, hello/world=321, test/time (ms)=100, test/status=0"
for /f "delims==," %%A in ("%input:*test/time (ms)=%") do echo %%A

在 JScript 的帮助下进行批处理

如果您有我的混合 JScript/batch REPL.BAT 实用程序,那么您可以使用正则表达式在您的解析中非常具体:

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() 子句中不需要 CALL。使用管道时也不需要它。

于 2013-09-25T10:57:02.330 回答
1

批处理文件:

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:, =" "%返回"test/ing=123" "hello/world=321" "test/time (ms)=100" "test/status=0"

外部FOR将分配%%i给先前结果中的每个字符串。

InnerFOR会将左侧的字符分配给=,将%%j右侧的字符分配给%%k

然后只是%%j与所需的键进行比较并在匹配时显示值。

于 2013-09-25T07:13:27.780 回答
1

VBScript/正则表达式:

>> 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
于 2013-09-25T07:00:27.170 回答