2016-07-15 119 views
0

我想匹配模式(使用java編程),但我只需要它的一部分。正則表達式 - 匹配模式但返回子模式

例...從下面的文字:

0 - Amount: 3 - Class 29 
1 - Amount: 2 - Class 21 
2 - Amount: 11 - Class 1 

我想匹配的模式「金額:\ d * - 類\ d *」,但只返回數對,從而使輸出類似於數組:

{ 
    {3, 29}, 
    {2, 21}, 
    {11, 1} 
} 

我可以用java正則表達式中實現的東西來做到嗎?我認爲搜索匹配的字符串是不必要的,正則表達式似乎已經爲這類問題做好了準備。

And ...做正則表達式(通常不僅是java正則表達式)有一個工具,以便從匹配的字符串中提取信息不需要額外的編程嗎?如果某些其他正則表達式的實現比Java的這個工作更好,我可以切換編程語言。

+0

Java的正則表達式支持捕獲組。 –

回答

1

你剛纔用在你的正則表達式中使用括號捕獲組:

Amount: (\d*) - Class (\d*) 
     ^--^-- Here---^---^ 

Regular expression visualization

Working demo

然後,你必須抓住從他們的內容與\1\2 。在Java中,你必須使用matcher.group(n)。例如,你可以有這樣的代碼:

String str = "0 - Amount: 3 - Class 29\n1 - Amount: 2 - Class 21\n2 - Amount: 11 - Class 1"; 

Pattern pattern = Pattern.compile("Amount: (\\d*) - Class (\\d*)"); 
Matcher matcher = pattern.matcher(str); 

StringBuffer sb = new StringBuffer("{"); 
while (matcher.find()){ 
    sb.append(String.format("{%s, %s},", matcher.group(1), matcher.group(2))); 
} 
sb.setLength(sb.length()-1); // remove last comma 
sb.append("}"); 

System.out.println(sb.toString()) 

Full IdeOne code

+0

這也與第二個捕獲組中的Class類匹配。我想他只是想要數字。 –

+1

@m_callens對不起,有一個錯字。用一些代碼更新答案。感謝您指出, –

+0

明白!該功能的名稱是「捕獲組」。我剛剛瞭解了在線正則表達式測試器和語言編譯器。謝謝!!! –