2013-03-19 18 views
7

我是Java新概念正則表達式的概念。RegExp混淆

誰能告訴我,我應該爲下面的字符串中使用正確的正則表達式 -

String exp = "ABCD_123_abc".

和我使用了上面的字符串的正則表達式爲:

regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)"

但是,下面的代碼的輸出是"**No Match Found**"

Public static void main() 
{ 
    String exp = "ABCD_123_abc"; 
    String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)"; 
    Pattern pattern = Pattern.compile(exp); 
    Matcher matcher = pattern.matcher(regExp); 
    if(matcher.matches()) 
    { 
    System.out.println("Match found"); 
    } 
    else 
    { 
    System.out.println(" NO Match found"); 
    } 


} 
+1

你在回答問題後是否修復了問題中的代碼?這很混亂。 – MikeFHay 2013-03-19 11:48:34

回答

12

的問題是:你不小心交換使用正則表達式模式和表達的檢查

String exp = "ABCD_123_abc"; 
String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)"; 

應採用

Pattern pattern = Pattern.compile(regExp); 
Matcher matcher = pattern.matcher(exp); 

Pattern.compile(String regex)函數接受正則表達式。

編輯

我很抱歉,我的第一個解決方案是真正的東西,必須永遠,永遠永遠完成:變量的名字是矛盾的值的含義......這意味着痛苦和流淚,並在憤怒的同時受到憤怒的同事的打擊。而沒有有效的防禦這個犯罪 ...

EDIT2 你可以得到單獨由Matcher.group(int)功能匹配組:

String matchedStringpart matcher.group(2); 

注意:我用2作爲參數:

  • 0裝置匹配的輸入序列
  • 1指(在這種情況下ABC)第一組
  • ...等等

如果你只需要123部分,我會改寫爲清晰起見,正則表達式:

regExp = "[a-zA-Z]+_([0-9]+)_[a-z]+"; 

但是,在這種情況下,group()必須用1調用,因爲現在第一個(也是唯一的)匹配組是第一個:

String matchedStringpart matcher.group(1); 
+4

實際上,我認爲'Pattern.compile(regExp)'更合理,這意味着OP會顛倒編譯和匹配語句,但本質上它是一個錯誤。 – FrankieTheKneeMan 2013-03-19 09:48:46

+2

解決它,但名稱現在非常誤導 – Junuxx 2013-03-19 09:49:40

+1

@all真,有時大腦是古怪的東西:)我認爲,如果字符串必須交換,我可以交換處理它(懶惰,這意味着更少的字符是改變) - 不知何故,我完全忽略了變量名稱的語義。在任何時候都不應該這樣做...... – ppeterka 2013-03-19 09:51:31

2

if(exp.matches(regExp))

這樣就足夠了。除非你有其他需求,否則你不需要模式/匹配器。

5

您的正則表達式爲完美無缺

問題來自於您在代碼中交換了expregExp。函數compile採用正則表達式作爲參數,而函數matcher需要表達式匹配。

8

你不編譯正則表達式。您需要

Pattern pattern = Pattern.compile(regExp); 
Matcher matcher = pattern.matcher(exp); 

即您的上述代碼混淆了正則表達式和輸入字符串。但是,您的實際正則表達式是正確的。

0

首先編譯正則表達式,然後使用匹配比較吧..

Pattern pattern = Pattern.compile(regExp); 
Matcher matcher = pattern.matcher(exp); 
4

你(編輯)的正則表達式的罰款。

如果你想提取123,你可以使用matcher.group(2)。該方法可以僅在之後被調用之後matchesfindmatcher.group(n)返回第n個capture group。捕獲組是包含在括號中的正則表達式的一部分。 matcher.group(0)返回匹配的字符串。

if(matcher.matches()) { 
    System.out.println(matcher.group(0)); 
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
    System.out.println(matcher.group(3)); 
} 

打印

ABCD_123_abc 
ABCD 
123 
abc 
1

如果您想取回123使用下面的代碼這種情況下:

System.out.println(matcher.group(2)); 

這將打印輸出:

你的正則表達式非常好。

1

此模式將起作用 - 它匹配任何數量的大寫或小寫字母,然後是下劃線,然後是任意數字的數字,然後是下劃線,然後是任意數量的大寫或小寫字母。如果您想更具體一些,可以使用{n}而不是+來匹配特定數量的字符。

public static void main(String[] args) { 
    final String myString = "ABCD_123_abc"; 
    final Pattern p = Pattern.compile("^[A-Za-z]++_(\\d++)_[A-Za-z]++$"); 
    final Matcher matcher = p.matcher(myString); 
    if (matcher.matches()) { 
     System.out.println(matcher.group(1)); 
    } 
}