正则表达式与'?'匹配

时间:2012-06-25 21:48:07

标签: regex

  

可能重复:
  Regex question mark

我试图弄清楚如何解析括号内的文本,但是在语句中的单引号之间。例如,如果我有以下声明:

(I have a 'cat', 'hat');

我希望结果是

cat
hat

我设法通过试验维基百科(http://en.wikipedia.org/wiki/Regular_expression)中定义的不同元字符来解决这个问题,但是我仍然无法理解其工作原理。

我试过这个:\'(.*)\'

我对此正则表达式的理解:我希望在单引号'之间插入字符,这些字符与任何单个字符.匹配的次数为*的零次或多次。

这导致:

cat', 'hat

在玩了一堆正则表达式后,我终于意外地结束了这个:\'(.*?)\'

这导致:

cat
hat

为什么这样做? (特别是我不明白'?'是如何工作的。)

4 个答案:

答案 0 :(得分:2)

默认情况下,正则表达式是贪婪的。通过使用问号,您将匹配更改为" lazy"模式。这意味着它匹配尽可能少的字符数。

答案 1 :(得分:2)

正则表达式的默认行为,使字符串中的尽可能长匹配。这被称为“贪婪”。

你是正确的?通常只是意味着匹配前面的项目(例如,字符)一次或多次,但*?是一个称为“懒星”的特殊情况,它切换正则表达式评估者进入“懒惰”模式。在这种模式下,评估者首先尝试跳过前面的项目(并在没有它的情况下完成匹配),然后“返回”它。

最终结果正是您所观察到的:它将匹配满足搜索条件的较短字符串而不是(默认值),从而找到最长的匹配。

用于测试正则表达式的便捷资源是here,对各种选项(包括懒星)的一个很好的描述是here

答案 2 :(得分:1)

这是因为,

()是对结果进行分组(这是您希望获得的结果)。

匹配。

* 让匹配出现0次或更多次。

是可选的,因此, ab?会出现 a ab

最后,(.*?)将匹配所有内容,但只有一次(?正在工作)或所有内容都是0次或更多次(*正在工作)。

答案 3 :(得分:0)

当*之后是?这使得*在懒惰模式下匹配。默认情况下它贪婪:尽可能多地吸收匹配的字符。在惰性模式下,它会尽可能早地继续使用其余模式。

首先是错误的方式。现在纠正了。