2013-06-27 63 views
1

我有這樣的正則表達式:Java的正則表達式每種情況匹配單獨

<a href(.*foo.bar.*)a> 

對於這個字符串,它給我的只有1場,但我需要它,得到3場比賽。

<a href="https://foo.bar/1">First</a> RANDOM TEXT COULD BE HERE <a href="https://foo.bar/2">Second</a> RANDOM TEXT COULD BE HERE <a href="https://foo.bar/3">Third</a> 

所以每個a href應該是個別的。

我怎麼能做到這一點?

編輯:

此代碼搜索匹配:

Pattern pattern = Pattern.compile("<a href(.*foo.bar.*)a>"); 
Matcher matcher = pattern.matcher(body); 
List<String> matches = new ArrayList<String>(); 
while (matcher.find()) { 
    matches.add(matcher.group()); 
} 
+1

你能告訴我們搜索匹配的代碼嗎? – JREN

+0

@JREN:添加了搜索者代碼 – Jaanus

+1

[*解析HTML是一個已解決的問題。你不需要解決它。你只需要懶惰。*](http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html) –

回答

6

更改爲:

<a href(.*?foo\.bar.*?)a> 

它消除了貪念。真正的點應該逃到\.

+0

謝謝,這工作。你在這裏使用懶星嗎? – Jaanus

+0

問題發生了,起點似乎也是貪婪。正則表達式將匹配整個部分,但只應該以結尾。 ' TEST TESTMY REAL PAGE' – Jaanus

+0

讓我們來更具體一點:' dda

0

希望下面的代碼將幫助您:

int noOfTimefoundString = 0; 
Pattern pattern = Pattern.compile("<a href=\"https://foo.bar"); 
Matcher matcher = pattern.matcher(body); 
List<String> matches = new ArrayList<String>(); 
while (matcher.find()) { 
    matches.add(matcher.group()); 
    noOfTimefoundString++; 
} 
Iterator matchesItr = matches.iterator(); 
while(matchesItr.hasNext()){ 
    System.out.println(matchesItr.next()); 
} 
System.out.println("No. of times search string found = "+noOfTimefoundString); 
+0

是的,但我需要將它們存儲到某個地方。我需要帶有標籤的完整網址。 – Jaanus

1

使用.*?而不是.*。貪婪的量詞匹配儘可能多的字符,而不情願的量詞匹配單個查找操作中的最少字符數。

此外,如果您打算匹配「foo.bar」的文字文本,請使用foo\.bar

+0

謝謝,像解釋。 – Jaanus