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 は、=との区切り文字を使用して 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/バッチ 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"

Outerは、前の結果から各文字列FORに割り当てられます。%%i

Innerは の左の文字を に、右FORの文字を に割り当てます。=%%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 に答える