2013-07-03 74 views
0

我已經通過了一些關於Java正則表達式的在線教程,但是我仍然發現構造正則表達式非常困難。在Java中構造正則表達式

示例文本(A鳴叫):

@HIMYM_CBS: Barney Stinson. That Guy's Awesome 

另一個樣品:

Barney Stinson. @HIMYM_CBS: That Guy's Awesome 

這是一個鳴叫HIMYM_CBS。

我想要完成的是,鑑於任何推文,我想知道該推文是否發給任何人(如本例中爲HIMYM_CBS)。無論它寄給誰都無所謂。

我的問題是:那麼構建一個正則表達式來完成這個任務應該是什麼?

的鳴叫存儲爲一個字符串:

String Tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome"; 
+0

您有什麼問題? –

+0

@RohitJain,我需要幫助創建這種情況下的正則表達式 – Chaos

+1

請參閱我的答案。 – Makky

回答

1
String tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome"; 
Pattern p = Pattern.compile("@(\\w+)"); 
Matcher m = p.matcher(tweet); 
if (m.find()) { 
    System.out.println(m.group(1)); 
} else { 
    System.out.println("not found."); 
} 

也許你想檢查Pattern類的API文檔。

代碼\w表示一個字符,相當於[a-zA-Z_0-9]

+0

謝謝,我無法理解\\ w *。 \ w是一個單詞字符? \\ w =中的第一個是什麼? – Chaos

+0

這會給你@之後的所有字符。這也是另一種方式。 – Makky

+2

@Chaos:正則表達式是@(\ w +)'。但是在Java中,正則表達式是由字符串和字符串組成的,'\'字符是特殊的,所以要在字符串中包含一個'\',我們''用另一個'\'逃避它。因此:'「@(\\ w +)」' –

0
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String Tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome"; 
     String regex = "@([^:]+)"; 
     Pattern compile = Pattern.compile(regex); 
     Matcher matcher = compile.matcher(Tweet); 
     if (matcher.find()) { 
      System.out.println(matcher.group(1)); 
     } 

    } 

} 

輸出:HIMYM_CBS

+0

[^:]是什麼意思?不是冒號? – Chaos

+0

這意味着獲取@和:之間的所有字符串。您的用戶名/ ID在@和:之間。值 – Makky

+0

@Chaos是的,它的意思是「除了a之外的任何東西」。Makky的正則表達式會找到@開頭,然後匹配到下一個:。 – feralin

2

將在正則表達式

@\\w+ 

工作?

+0

如果在@之前有某些東西,這個工作是否會起作用? – Chaos

+0

@Chaos是的,我相信它會...... – feralin

+0

爲什麼不用'@ \\ w +'代替它,或者它在java風格中不可用? – HamZa

1
/(?:^|(?<=\s))@([A-Za-z_0-9]+)(?=[.?,:]?\s)/ 

只能在一個Twitter手柄使用字母,數字和下劃線(_)。

樣品測試用例
@This(在一行的開頭相匹配)的正則表達式忽略@此但在像@this一個句子的結尾上@separate令牌以及令牌相匹配。或@this? (沒有選擇.?)和@this:和@this,如直接消息SO樣式。是的,任何[email protected]在推文中也被忽略。

正則表達式,而在@匹配,您還可以快速訪問什麼是它(如在@useriduserid)通過拿起它的形式Matcher#group(1)後。

4

Twitter用戶名最長爲15個字符,並以@開頭,並且只能包含字母數字和下劃線。

所以要使用正則表達式是:

(?<=\s|\A)@(\w{1,15}) 
^ ^^^ ^^^^^ ^")" ends a matching group. 
| | || |||| | matches preceding expression between 1 and 15 times. 
| | || |||| "\w" matches [a-zA-Z0-9_] 
| | || ||| "(" begins a matching group 
| | || || literal "@" 
| | || | ")" ends the zero-width lookbehind assertion 
| | || "\A" will match the beginning of the string 
| | | "|" denotes that either this or that matches 
| | "\s" matches a space character 
| "(?<=" is the beginning of a zero-width lookbehind assertion 
+1

對不起,在這裏使用\ b是錯誤的。我從來沒有在@之類的非單詞字符旁邊使用它;我認爲它只匹配單詞字符和非單詞字符(或者在源代碼的開頭或結尾),因此上面的代碼將匹配'abc @ def'而不是'abc @ def',而不是'Another Sample 「在原來的問題。 – ajb

+0

@ajb,啊!你是對的,我已經更新了我的答案。 – OmnipotentEntity