2009-09-26 51 views
-1

我正在閱讀Java正則表達式教程,它似乎只教會測試模式是否匹配,但不告訴我如何引用匹配的模式。Java中的正則表達式:如何引用「匹配模式」?

例如,我有一個字符串「我的名字是xxxxx」。我想打印xxxx。我如何用Java正則表達式來做到這一點?

謝謝。

回答

2

是你讀什麼教程?太陽的一個解決這個話題相當徹底,但你必須正確閱讀:)

通過括號完成捕獲的一部分字符串。如果你想在一個字符串中捕獲一個組,你必須將這部分正則表達式放在括號內。這些組按照括號出現的順序定義,索引爲0的組表示整個字符串。

例如,正則表達式 「日([0-9] +) - 注([0-9] +)」 將限定3個基團:

  • 組(0):整個字符串
  • 組(1):在正規表達式的第一組,即在日數
  • 組(2):在正規表達式的第二組,即音符號碼

至於實際的代碼,以及如何找回你已經在你的正則表達式定義的組,看一下Java文檔,尤其是匹配器類及其組方法:http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html

您可以測試與非常有用的工具正則表達式:http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html

希望這有助於, 乾杯

0

可以使用Matchergroup(int)方法:

Pattern p = Pattern.compile("My name is (.*)"); 
    Matcher m = p.matcher("My name is akf"); 
    m.find(); 
    String s = m.group(1); //grab the first group* 
    System.out.println(s); 

輸出:

akf 

*看看matching groups

1

注意在模式中使用括號和Matchergroup()方法

import java.util.regex.*; 

public class Example { 
    static public void main(String[] args) { 
     Pattern regex = Pattern.compile("My name is (.*)"); 
     String s = "My name is Michael"; 
     Matcher matcher = regex.matcher(s); 

     if (matcher.matches()) { 
      System.out.println("original string: " + matcher.group(0)); 
      System.out.println("first group: " + matcher.group(1)); 
     } 
    } 
} 

輸出是:

original string: My name is Michael 
first group: Michael 
+0

我不明白組的概念。 比方說,我有一個字符串「我的名字是邁克爾傑克遜,他的名字是巴拉克奧巴馬」。我想抓住「邁克爾傑克遜」和「巴拉克奧巴馬」。我該怎麼做? – Saobi 2009-09-26 03:01:43

+0

@Saobi:注意括號!!!! – 2009-09-26 03:07:47

+0

好的。我知道了。我又遇到了另一個難題: 是否xxx xxx(可能是任意數量的單詞)是生還是死? 我想捕捉:xxxxxx,活着,死去。 我該怎麼做? – Saobi 2009-09-26 03:20:02

0
Matcher m = Pattern.compile("name is (.*)").matcher("My name is Ross"); 
if (m.find()) { 
    System.out.println(m.group(0)); 
    System.out.println(m.group(1)); 
} 

的括號形成捕獲組。組0是整個模式,組1是反向參考

上述程序的輸出:

name is Ross 
Ross