2016-09-09 3 views
1

私は、単語境界がテキスト内で正確にその単語が見つかっていることを確認し、単語の一部だけが含まれていると他の単語を切り捨てないことを確認しましたが、 Stringの開始と終了。Javaで境界マッチングを使用して正規表現を書く最も効率的な方法は何ですか?

String regex1 = "\\b" + searchedWord + "\\b"; 

それは私が好きな正規表現を変換しなければならなかったが判明しかし:だから理想的に言葉も始まることが/終了ですので、私は、このような正規表現は、文字列の開始と終了でうまく動作期待

このことは、文字列の開始と終了のためにもうまく動作することを確認するために:私はまだ後者の正規表現を使用して、任意の副作用を発見していない

String regex2 = "(^|\\b)" + searchedWord + "($|\\b)"; 

、しかし私は、特別な境界またはどのようにがあるかどうかを知りたいです境界線をより効率的に書き込んで、より醜いものにする反直観的ではありません。

もっと良い方法を知っていますか?おそらくあなたはまた、それを使用する問題を認識している場合に備えて、私の提案された正規表現を改善することもできます。

+0

あなたは、動作すると思われるものの完全な例を示してください。通常、単語の境界は文字列の最初と最後で一致する必要があるため、問題は別の場所にある可能性があります。 –

+0

'\ b'は文脈に依存した構造であり、隣接するサブパターンに一致するものに依存します。先頭の '\ b'を'(?<!\ w) 'で置き換え、末尾を'(?!\ w) 'で置き換えたい場合があります。 –

+0

ところで、あなたの 'searchWord'の最初と最後の文字が単語の文字であれば、副作用はありません。 –

答えて

0

searchWordの最初と最後の文字が単語文字の場合、副作用がない可能性があります。

「サイド」エフェクトは、両端の文字が単語以外の文字の場合にのみ表示されます。

\bは、文字列開始と単語charの間、単語と文字以外の文字の間、単語と非単語の間、単語charと文字列の最後の4つの位置で一致することがあります。 searchWordの前に単語charがないことを確認する必要がある場合は、曖昧さのない(?<!\w)ネガティブ検索ビヘイビアを使用し、単語の後に単語charがないことを確認するには、(?!\w)否定先読みを使用できます。

\bは、\wと同じですが、それ自体はUnicode対応ではありません。 Pattern.UNICODE_CHARACTER_CLASSフラグまたは(?U)を追加します。

String regex1 = "(?U)(?<!\\w)" + searchedWord + "(?!\\w)"; 

他の方法は、多くの場合、

String regex1 = "(?U)(?<!\\S)" + searchedWord + "(?!\\S)"; 

でこれは前に右または右には一致しませんスペースが周りの(または文字列の開始/終了時)があることを確認することが含ましかし句読点の後に。

関連する問題