2017-06-13 43 views
2

我正在寫一個小程序,通過使用正則表達式提取Tweeter消息中提到的用戶名。但是,在某些測試案例中,部分程序失敗。基本上,下面指定的正則表達式能夠匹配text1但不匹配text2。現在,下面的正則表達式模式僅用於匹配特定的測試用例,當字符串中的第一個字符是「@」時,後跟高音用戶名。我想我一定誤解了這個正則表達式,並錯誤地使用了它。請問有人能夠對此有所瞭解?Java正則表達式提取Tweeter消息中提到的名稱

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 

在此先感謝。

回答

1

沒有確切知道你打算用正則表達式做什麼,我可以建議你更改以下格局:

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

此標識的Twitter主題標籤作爲字符串開始或者在一個@符號字符串的非常開始,或者如果以空格開頭,則在字符串的中間。您可以查看下面的演示,該正則表達式不會捕獲電子郵件地址。您當前的模式是在字符串的最開始處搜索哈希標籤,並且不允許在第一個標籤之後出現空格,然後是另一個標籤。

Demo

+0

是的,我目前的正則表達式只在最開始時搜索標籤。在我的程序中,我實際上是使用這個正則表達式來檢查字符串開頭是否有一個hashtag。否則,我將使用另一個正則表達式來搜索正文中的任何其他hashtag。 你的正則表達式的問題是,它也會檢測到像電子郵件地址這樣的有效twitter標籤。下面的這個正則表達式會稍微適合嗎? 「[\\ W && [^ @]] *((?=。* [A-Za-z0-9])[\\ 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()); 

這將在文本中找到模式的發生。