0

仕事で次の正規表現に出くわしました。それは何をするためのものか?

,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))

それを理解するために、私はそれを次の部分に分割しました

  • ,= 持っているものすべてに一致,

  • (?== 続いて

  • (?:[^\"]*\"[^\"]*\")*= 一致しないもの"、その後に"、一致しないもの"、その後に". たとえば、1111"aaaaa"

  • (?![^\"]*\")"= しかし、一致しないものは何も続かない"

つまり、OR が後に,続くものすべてに一致します。11111"111"""

で区切られた文字列を単にトークン化するために上記の式が使用されるユースケース,ですが、作成者がより一般的なもののために構築したと想定しています。

誰かが上記よりも簡単な説明を提供できますか?

上記の式は、boost::regex() に式を割り当てるために使用されます。

更新:実際には、次の制約で「、」コンマを検索しています

  1. コンマに続く"は偶数でもOK

  2. ただし、コンマの後に " を 1 つだけ付けても問題ありません

たとえば、次の文字列を考えてみましょう: a, "h,w", 23

最初の "," は、その後に偶数個の " ("h,w") があるため、一致します。

"h,w" の間の 2 番目の "," は、2 番目の式 (?![^\"]*\") により、"," の後に単一の "

最後に最後の「,」が一致します。

最終的な出力は 2 , , になります

4

1 に答える 1

2

任意のコンマに一致するように見えますが、そのコンマの後に偶数個の"文字がある場合に限ります。

,- コンマ。

(?=- に続く...

(?:[^\"]*\"[^\"]*\")*- マークで終わり、"マークの総数が偶数"の文字列、または空の文字列、

(?![^\"]*\")- そして、文字列の後ろに他の"マークはありません。

)を閉じます(?=

"これは、入力文字列全体の文字数の合計が均等であり、引用符のネストやエスケープがなく、引用符の間のコンマを区切り文字として扱うべきではないことが既にわかっている場合に役立ちます。たとえば、入力が与えられた場合

25,"Hello, world!","More text",123.45

正規表現は、Hello と world の間のコンマと一致する必要はありませんが、他の 3 つのコンマと一致する必要があります。

于 2012-12-01T05:44:47.693 に答える