2012-07-04 22 views
5

私はかなり独特の問題があります。私は[some string][word boundary]のようなパターンを見つけようとしています。簡体字、私のコードは次のとおりです。 bが一致しない

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

私のロジックに関係なくsomeStringが何であるかの、trueこれは常に出力すべきと言われます。しかし:

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

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

答えて

6

ドットの場合、スペースは単語境界ではありません。

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

4

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

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

+0

間はい、しかしabc.' 'で期間は' Pattern.quote(経由(正規表現の一部となるべき "ABC。") '。だから、パターンは「' abc.'になるべきそれに続く「abc.」とスペースの後に続く「単語境界」が続きます。 – Felix

+1

@単語境界になる文字のためのフェリックス単語文字が前に付いた非単語文字でなければなりません。 –

+0

ありがとう!「\ W」のような文字クラスのショートカットだったという印象を受けました。 – Felix

関連する問題