1

可能重复:
正则表达式问号

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

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

我希望结果是

cat
hat

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

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

我对这个正则表达式的理解:我想让单引号之间的字符'和这些字符匹配任何单个字符.零次或多次*

这导致:

cat', 'hat

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

这导致:

cat
hat

为什么这行得通?(特别是我不明白“?”是如何工作的。)

4

4 回答 4

2

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

于 2012-06-25T21:52:18.117 回答
2

正则表达式的默认行为是在字符串中进行最长可能的匹配。这被称为“贪婪”。

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

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

此处是测试正则表达式的便捷资源,此处对各种选项(包括惰性星号)进行了很好的描述

于 2012-06-25T22:03:02.190 回答
1

这是有效的,因为,

()是对你的结果进行分组(这是你想要得到的回报)。

. 匹配一切。

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

? 是可选的,所以,ab?将案例aab

最后,(.*?)将匹配除一次(?工作)或 0 次或多次(*工作)之外的所有内容。

于 2012-06-25T21:57:24.817 回答
0

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

一开始就搞错了。现在更正了。

于 2012-06-25T21:50:53.960 回答