0

asd["]"]私は内部で一致する必要がありますasd["]"] asd

私は正規表現を使用します:

/([a-z]+?(\[[^,\]]*?\]|\[\".*\"\]))/u

しかし、それは私に与えますasd["]

正規表現のOR要素の順序を変更した場合:

/([a-z]+?(\[\".*\"\]|\[[^,\]]*?\]))/u

私は望ましい結果を得ることができますが、この方法では他のいくつかのケースがうまくいかなかったと思います。これは私の正規表現の縮小版です。

可能な限り長い一致を選択するために正規表現をどのように指すことができますか(貪欲に行動する)?

編集:

正規表現を使用する場合:

/{((\"a\")|([^b]*)})/u

私は得る

{c {"a"}

から

{b{c {"a"} b}

この場合、正規表現は最初よりも長い2番目のORステートメントを選択しました。

4

2 に答える 2

0

何らかの理由で、あなたの 2 つの選択肢で、それを必要としない貪欲でない方を作成し、実際に貪欲である必要がある貪欲な方を残しました。正規表現に関する問題を解決するには (いくつか注意点がありますが)、どのような場合でも否定文字クラスを使用する必要があります。

'/([a-z]+?)\[([^"\[\]]*|"[^"]*")\]/'

これは、与えられた例ではうまくいくはずです。最も内側のasd[something here]orを見つけますasd["something with [][] here"]

注意点を話していました。引用符で囲まれていない場合、これはネストされたオカレンスを見つけることができません。そのasd[b efg[something]]中で一致efg[something]し、外側のブラケットではありません。ただし、一致したとしても、一致は重複できないため、内側の一致は失われます。最も外側の有効なブラケット (つまり、指定された例では完全な文字列のみ) を見つけたい場合は、PCRE の再帰機能を調べる必要があります。最も内側または最も外側を決定する必要があることに注意してください。ネストされたすべての一致を見つけることpreg_matchもできません。preg_match_all

于 2012-11-14T10:06:44.413 に答える
0

この正規表現は私にとってはうまくいくようでした:

/([a-z]+(\[[^,]*\]|\[\".*\"\]))/

その中で、元の正規表現の [^,\]] セクション内の \] を削除し、貪欲でないワイルドカードをすべて削除しましたが、とにかく効果がないように見えました。
ネストされた構造を探している場合、「閉じていない記号」を探しても、最初の (最も内側の) 閉じ文字で常に停止するため、最長の一致を見つけることはできません。したがって、エンクロージャ内で一意のものを選択する必要があります。 .

于 2014-03-05T23:05:40.677 に答える