理解正则表达式中的内容

时间:2012-02-11 04:41:53

标签: java regex

如果我在字符串上使用分隔符:

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("<.*?>");

将适用于两者。

据我了解,"<.*>"应排除以“&lt;”开头的字符串跟随任何字符0次或更多次,直到它达到“&gt;”。所以它不应该再开始排除,直到它达到另一个“&lt;”?

1 个答案:

答案 0 :(得分:3)

这是因为第二个表达式使用不情愿(而不是 greedy )量词,这意味着它不会尝试匹配整个字符串并从就像第一个那样。

这个表达式"<.*>"试图尽可能地进入你的输入字符串,所以它一直到最后。一旦它在那里,它发现它有一个匹配,所以它停止。不情愿的版本"<.*?>"不会这样做:它与第一个>匹配,并停止。

This article提供了关于量词的精彩读物。