5

私はかなり独特の問題を抱えています。のようなパターンを見つけようとしています[some string][word boundary]。簡略化すると、私のコードは次のとおりです。

final Pattern pattern = Pattern.compile(Pattern.quote(someString) + "\\b");
final String value = someString + " ";
System.out.println(pattern.matcher(value).find());

私のロジックは、これtrueが何であるかに関係なく、常に出力する必要があることを示してsomeStringいます。でも:

  • someString単語文字 (例: "abc") で終わる場合は、true出力されます。
  • 単語境界で終わる場合someString(例: "abc.")falseが出力されます。

何が起こっているのですか?私の現在の回避策は、\Wの代わりに使用する\bことですが、その意味はわかりません。

4

2 に答える 2

6

ドットとスペースは単語境界ではありません。

単語の境界は、単語の文字と単語以外の文字の間、またはその逆です。
すなわち、[a-zA-Z0-9_][^a-zA-Z0-9_]またはの間[^a-zA-Z0-9_][a-zA-Z0-9_]

于 2012-07-04T13:21:13.860 に答える
4

単語境界は、単語文字が先行する非単語文字、またはその逆です。ピリオド (単語以外の 2 文字) が前にあるスペースは、この要件を満たしていません。

using の効果は、\W単語以外の文字が一致することです( と同じ\bですが、文字の前に単語文字があるという条件はありません)。これは、例では正しいようです。

于 2012-07-04T13:18:14.440 に答える