正規表現がこの仕事に最適なツールだとは思いませんが、現在持っているものを微調整して最適化したいだけなら、境界という単語を使用し\b
、不要なキャプチャ グループとオプションの繰り返し指定子を捨てて、所有格を使用できます。繰り返し:
\bworld\b(?![^<>]*+>)
幅がゼロの単語境界アンカーで囲まれている\bworld\b
ことを確認します。これにより、 inと"world"
が一致しなくなります。単語境界の定義は、希望どおりではない場合があることに注意してください。たとえば、 inと一致しません。"world"
"underworld"
"worldwide"
\bworld\b
"world"
"a_world_domination"
元のパターンには、 のようなサブパターンも含まれています(x+)?
。これは、単純にx*
. つまり?
、 "one-or-more"の "zero-or-one" ではなく+
、単に "zero-or-more"*
です。
キャプチャ グループ(…)
は機能的には不要であり、置換の置換にキャプチャは必要ないように思われるため、それを取り除くとパフォーマンスが向上します (グループ化の側面が必要で、キャプチャの側面が必要ない場合は、次のことができます)。(?:…)
代わりに非キャプチャ グループを使用してください)。
[^<]
の代わりに、両方のブラケットを で禁止することにも注意してください[^<>]
。この場合、バックトラックが必要ないため、繰り返しを所有格として指定できるようになりました。
([…]
は文字クラス. のようなもの[aeiou]
は、小文字の母音のいずれかに一致します。[^…]
は否定文字クラスです。小文字の母音以外[^aeiou]
のいずれかに一致します。)
もちろん(?!…)
、否定的な先読みです。これは、特定のパターンが一致しないことを表明します。したがって、全体的なパターンは次のようになります。
\bworld\b(?![^<>]*+>)
\_______/\__________/ NOT the case that
"world" the first bracket to its right is a closing one
surrounded by
word boundary anchors
参考文献
Java 文字列リテラルでバックスラッシュを取得するには、それを 2 倍にする必要があることに注意してください。したがって、Java 文字列リテラルとしてのパターン全体は"\\bworld\\b(?![^<>]*+>)"
.