2016-12-30 22 views
3

中(#)記号一部のテキストが(境界を無視して)単語を含む場合、私はチェックの正規表現を持っているのマッチング
String regexp = ".*\\bSOME_WORD_HERE\\b.*"; が、この正規表現の戻りfalse「SOME_WORDは」#(ハッシュタグ)で始まります。ポンドと単語の正規表現

正確
Example, without # 
String text = "some text and test word"; 
String matchingWord = "test"; 
boolean contains = text.matches(".*\\b" + matchingWord + "\\b.*"); 
// now contains == true; 

But with hashtag `contains` was false. Example: 
text = "some text and #test word"; 
matchingWord = "#test"; 
contains = text.matches(".*\\b" + matchingWord + "\\b.*"); 
//contains == fasle; but I expect true  
+0

したがって、単語の境界として一致させる必要はありますか?文字列または空白の開始?通常、 '(?<!\\ S)'を最初の境界として使用し、 '(?!\\ S)'を後続のものとして使用することができます( 'text.matches(" \ S) "+ matchingWord +"(?!\\ S)。* ");')。 –

+0

検索語が単語の中に入っていないことを確認するもう1つの通常の解決方法は、明確な語の境界を使用していることです:text.matches( "。*(?<!\\ w)" + matchingWord + " * ")' –

+0

特別なケースや複数のシナリオがある場合に 'regex'のために' text.contains( "#test") 'result'を' true'にするだけです –

答えて

1

\b#パターンは、単語の文字で先行され#に一致します、数字またはアンダースコア。

単語が先行していない#と一致する必要がある場合は、負の検索ビハインド(?<!\w)を使用してください。同様に、非単語の文字がある場合は、末尾の\b一致していることを確認し(?!\w)否定先読みを使用する:あなたのmatchingWordは特別な正規表現のメタ文字を含めることができる場合

text.matches("(?s).*(?<!\\w)" + matchingWord + "(?!\\w).*"); 

Pattern.quote(matchingWord)を使用することは良いアイデアです。

あなたは空白の間に検索ワードに一致するか、文字列の開始/終了することを計画している場合あるいは、あなたは末尾の1

text.matches("(?s).*(?<!\\S)" + matchingWord + "(?!\\S).*"); 

そしてもう一つとして初期境界と(?!\S)として(?<!\S)を使用することができます。 .matches.*は最高の正規表現ソリューションではありません。 "(?<!\\S)" + matchingWord + "(?!\\S)"Matcher#find()のような正規表現は、より最適化された方法で処理されますが、そのためにMatcherオブジェクトを初期化する必要があります。

+0

この作業は、ありがとう。しかし、一つのこと。テキスト内の単語を一致させた後に改行記号があれば、正規表現はfalseを返します。例 "test#test \ ntest"を実行します。あなたはこの正規表現をimpoveしていただけますか? –

+0

'(?s)'を追加します。しかし、 'Matcher#find()'を使うと、それは必要ないでしょう。 –

+1

ウーホー、ありがとう。 Matcher#find()はうまくいきます! –

0

未解決策、それはもう正規表現を使用していないが、あなたが使用して簡単にそれを行うことができますように含まれています手紙:

text = "some text and #test word"; 
    matchingWord = "#test"; 
    contains = text.contains(matchingWord); 
    // contains == true 
+0

文字列が 'some #testing word here 'のようなものであれば偽陽性を返します。 –

+0

@WiktorStribiżewright。だから私はregexpを使う必要がある。なぜなら、単語全体が一致する必要があるからだが、 'contains'は他の状況で真を返すだろう(例えば、 'testing'の 'test'の場合) –