2012-02-11 44 views
4

如果我使用一個分隔符上的字符串:理解的東西在正則表達式

Scanner scanString = new Scanner(line).useDelimiter("<.*>"); 

我想知道爲什麼在

<a href="https://post.craigslist.org/c/snj?lang=en">post to classifieds</a> 

這將不保留文本,但它會在一條線上只有

<option value="ccc">community 

雖然

Scanner scanString = new Scanner(line).useDelimiter("<.*?>"); 

將適用於兩者。

據我所知,"<.*>"應排除以「<」開頭的字符串,後跟任意字符0次或更多次,直到達到「>」。所以它不應該開始排除,直到它達到另一個「<」?

+0

使用類似Expresso的工具:http://www.ultrapico.com/Expresso.htm – 2012-02-11 04:45:31

+0

您也可以閱讀http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contained-tags和http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not – 2012-02-11 05:59:55

回答

3

這是因爲第二表達式使用不願(相對於貪婪)量詞,這意味着它不試圖匹配整個字符串並從那裏回退,像第一個一樣。

該表達式"<.*>"試圖儘可能地將您的輸入字符串放到輸入字符串中,因此它一直到最後。一旦它在那裏,它發現它有一個匹配,所以它停止。不情願的版本"<.*?>"不這樣做:它匹配到第一個>,並停止。

This article提供了量詞的很好的閱讀。

+0

哇,這使得只是非常有道理。那篇文章看起來非常有幫助。謝謝! – 2012-02-11 04:56:44

相關問題