私が正規表現を持っているとしましょう:
(CC|NP)*
そのため、Java の look-before 正規表現で問題が発生します。それらの問題を回避するには、どのように記述すればよいでしょうか。私はそれを次のように書き直すことを考えました:
(CC|NP){1,9}
正規表現でテストすると、上限が完全に無視されているようです。 Java では、これらの数量詞 {} は、次のように非グループ正規表現要素でのみ機能するようです。
\w+\[\S{1,9}\]
私が正規表現を持っているとしましょう:
(CC|NP)*
そのため、Java の look-before 正規表現で問題が発生します。それらの問題を回避するには、どのように記述すればよいでしょうか。私はそれを次のように書き直すことを考えました:
(CC|NP){1,9}
正規表現でテストすると、上限が完全に無視されているようです。 Java では、これらの数量詞 {} は、次のように非グループ正規表現要素でのみ機能するようです。
\w+\[\S{1,9}\]
申し訳ありませんが、後ろ向きパターンは通常、サブパターンに制限があります。fxいくつかのフレーバーで後読みの有限反復が機能しないのはなぜですか?pを参照してください。または、Web で「後読みパターンの制限」を検索してください。
後読みパターンのすべての固定長バリアントを交互パターンとして書き留めてみてください。でもこれは多いかも…
通常は内側のパターンを照合し、実際のターゲットを照合してグループ化することで、後読みをシミュレートすることもできます。(?:CC|NP)*(.*)
どこで問題を認識しているのかわかりません。量指定子は、他のエンティティと同様にグループに作用します。
したがって、同じ結果で\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}