2017-06-13 4 views
2

私は、正規表現を使用してTweeterのメッセージに記載されているユーザー名を抽出する小さなプログラムを作成しています。しかし、いくつかのテストケースでは、プログラムの一部が失敗しています。基本的に、以下で指定された正規表現パターンはtext1とマッチできますが、text2ではマッチできません。さて、以下の正規表現パターンは、文字列の最初の文字が "@"で、その後にtweeterの有効なユーザ名が続く特定のテストケースにマッチすることを意図しています。私はこの正規表現を誤解して、間違って使っていたに違いないと思う。誰かがこれでいくつかの光を当てることができるだろうか?ツイッターメッセージで上記の名前を抽出するJavaの正規表現

String validTweetPattern1 = "^[@]((?=.*[A-Za-z0-9])[\\w-_]+)"; 
String text1 = "@mention"; 
String text2 = "@mention @hello"; 

System.out.println(Pattern.matches(validTweetPattern1, text1)); 
System.out.println(Pattern.matches(validTweetPattern1, text2)); 

Console Output: 
True 
False 

ありがとうございます。

String validTweetPattern1 = "(?:^|.*\\s+)[@]((?=.*[A-Za-z0-9])[\\w-_]+).*"; 

これは時のいずれか@記号で始まる文字列としてTwitterのハッシュタグを識別します

あなたが正規表現で行う予定かを正確に知らず

答えて

1

、私はあなたが以下のパターンを変更することを提案することができます空白で始まる文字列の真ん中または文字列の真ん中。下のデモで、この正規表現が電子メールアドレスを取得していないことを確認できます。あなたの現在のパターンは、文字列の最初のところでハッシュタグを探していて、最初のタグの後ろに別のタグが続くスペースも許されていません。

Demo

+0

はい、私の現在の正規表現は、最初のハッシュタグのみを検索します。私のプログラムでは、実際にこの正規表現を使用して、文字列の先頭にハッシュタグがあるかどうかを確認しています。それ以外の場合は、別の正規表現を使用して本文中の他のハッシュタグを検索します。 正規表現の問題は、有効なツイッターハッシュタグとして電子メールアドレスのようなものも検出することです。この正規表現は、以下に少し適していますか? "[\\ W && [^ @]] *(?=。* [A-Za-z0-9])[\\ w -_] +)[\\ W && [^ @]] *" – Zen

+0

@ Zen私の正規表現のロジックを更新しました。 –

0

Pattern.matches()のみ完全に一致した場合にTRUEを返します。それを継続して使用したい場合は、パターンを"^[@]((?=.*[A-Za-z0-9])[\\w-_]+)\\s*.*"に変更する必要があります。これにより、可能な空白の後に可能性のある文字が追加されます。

他のオプションは、現在のパターンでmatcherクラスを使用することです。

System.out.println(Pattern.compile(validTweetPattern1).matcher(text1).find()); 
    System.out.println(Pattern.compile(validTweetPattern1).matcher(text2).find()); 

これは、テキストにパターンの出現を検出します。