0

次のテスト文字列があるとします。

Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get_Stop

ここで、_は任意の文字を意味します。例:StartaGetbbGetcccGetddddStopeeeeeStart...。

抽出したいのは、StartおよびStop区切り文字内のGetワードの最後の出現です。ここでの結果は、以下の3つの太字のGetになります。

Start__Get__Get__ Get __Stop__Start__Get__ Get __Stop__Start__ Get __Stop

私はこれを正規表現のみを使用して、可能な限り1回のパスで実行したいと考えています。

任意の提案を歓迎します

ありがとう'

4

5 に答える 5

1
Get(?=(?:(?!Get|Start|Stop).)*Stop)

あなたStartStop区切り文字は常に適切にバランスが取れており、ネストすることはできないと思います。

于 2010-07-26T20:05:23.673 に答える
0

このようなもの、多分:

(?<=Start(?:.Get)*)Get(?=.Stop)

これには、可変長のルックビハインドサポートが必要ですが、すべての正規表現エンジンがサポートしているわけではありません。最初の長さをまたは同様のもの
に変更することで、最大長を作成できます。これは、さらにいくつか(ただしすべてではありません)サポートします。*{0,99}

また、先読みでは、二重アンダースコアがタイプミスであるかどうかに応じて、またはである.必要があります。.+.{1,2}

于 2010-07-26T13:45:14.043 に答える
0

私は2つのパスでそれをしたでしょう。最初のパスは「Get」という単語を検索し、2番目のパスはその単語の出現回数をカウントします。

于 2010-07-26T13:15:43.117 に答える
0
$ echo "Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get__Stop" | awk -vRS="Stop" -F"_*" '{print $(NF-1)}'
Get
Get
Get
于 2010-07-26T13:15:51.603 に答える
0

Perlで、私はします:

my $test = "Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get_Stop";
$test =~ s#(?<=Start_)((Get_)*)(Get)(?=_Stop)#$1<FOUND>$3</FOUND>#g;
print $test;

出力:

Start_Get_Get_<FOUND>Get</FOUND>_Stop_Start_Get_<FOUND>Get</FOUND>_Stop_Start_<FOUND>Get</FOUND>_Stop

正規表現のフレーバーに適応する必要があります。

于 2010-07-26T14:27:39.797 に答える