1

助けてくれる正規表現の専門家がいることを願っています。何時間も探していますが、答えが見つかりません。

これは入力文字列です:

parameters:x,y,123,z;parameters:a,b,456,c;

パズルは、パラメーターの最後の部分 (a、b、456、c) を取得することです。「parameters:」で始まり、「、c」で終わることがわかっています。

だから私は次の正規表現を試しました:

parameters:(.+?,c);

これは、予想される最後の部分ではなく、最初のパラメーターから始まる部分と一致します。これは一致グループです:

x,y,123,z;parameters:a,b,456,c

だから?遅延一致を行うことは、私が望む以上に一致するため、十分に遅延しているわけではありません。

助言がありますか?

4

2 に答える 2

4

正規表現は、定義したことを正確に実行しています。「パラメーター」に一致し、最初の「c」が見つかるまで遅延します。

これを試して:

parameters:([^;]+,c);

[^;]";" 以外のすべての文字に一致する否定文字クラスです。のようだ ; そのようなグループ内で発生することはできません。

ここでRegexrを参照してください

于 2013-03-01T16:50:16.267 に答える
3

最も簡単な方法は、禁止:;てマッチングから除外することです。

parameters:([^:;]+,c);

parametersまたは、より明確にして、2 回のマッチングを禁止することもできます。

parameters:((?:(?!parameters).)+,c);

正規表現が十分に怠惰ではなかった理由は、正規表現の一致が可能な限り早い位置から始まり、 .+?必要なだけ一致するためです (文字列の最初から、parameters:一致することがわかった文字列とまったく同じです)。

于 2013-03-01T16:49:42.510 に答える