0

私が正規表現を持っているとしましょう:

(CC|NP)*

そのため、Java の look-before 正規表現で問題が発生します。それらの問題を回避するには、どのように記述すればよいでしょうか。私はそれを次のように書き直すことを考えました:

(CC|NP){1,9}

正規表現でテストすると、上限が完全に無視されているようです。 Java では、これらの数量詞 {} は、次のように非グループ正規表現要素でのみ機能するようです。

\w+\[\S{1,9}\]
4

2 に答える 2

1

申し訳ありませんが、後ろ向きパターンは通常、サブパターンに制限があります。fxいくつかのフレーバーで後読みの有限反復が機能しないのはなぜですか?pを参照してください。または、Web で「後読みパターンの制限」を検索してください。

後読みパターンのすべての固定長バリアントを交互パターンとして書き留めてみてください。でもこれは多いかも…

通常は内側のパターンを照合し、実際のターゲットを照合してグループ化することで、後読みをシミュレートすることもできます。(?:CC|NP)*(.*)

于 2012-07-06T15:46:41.937 に答える
1

どこで問題を認識しているのかわかりません。量指定子は、他のエンティティと同様にグループに作用します。

したがって、同じ結果で\w+\[\S{1,9}\]書かれている可能性があります。\w+\[(\S){1,9}\]

正規表現に関するあなたの例に関する限り、そこでは何も壊れていません。それは本来あるべきものと一致します。

(PUN|CC|NP){1,3}貪欲に (左から右の優先順位で) 代替のいずれかに一致させようとします。それが一致するものに休憩はありません。PUN、CC、または NP の 1 ~ 3 回の連続発生に一致します。

ご提供いただいたサンプル文字列は、CC 間にスペースがありました。正規表現にスペースが存在しないため、一致しません。一致するのは単一のCC.

スペースを考慮したい場合は、次のようにグループに追加できます。
(?:(?:PUN|CC|NP)\s*){1,3}

代替の間にスペースのみを許可する場合は、次のように実行できます。
(?:PUN|CC|NP)(?:\s*(?:PUN|CC|NP)){0,2}

于 2012-07-06T18:16:36.670 に答える