可能重复:
Regex question mark
我试图弄清楚如何解析括号内的文本,但是在语句中的单引号之间。例如,如果我有以下声明:
(I have a 'cat', 'hat');
我希望结果是
cat
hat
我设法通过试验维基百科(http://en.wikipedia.org/wiki/Regular_expression)中定义的不同元字符来解决这个问题,但是我仍然无法理解其工作原理。
我试过这个:\'(.*)\'
我对此正则表达式的理解:我希望在单引号'
之间插入字符,这些字符与任何单个字符.
匹配的次数为*
的零次或多次。
这导致:
cat', 'hat
在玩了一堆正则表达式后,我终于意外地结束了这个:\'(.*?)\'
这导致:
cat
hat
为什么这样做? (特别是我不明白'?'是如何工作的。)
答案 0 :(得分:2)
默认情况下,正则表达式是贪婪的。通过使用问号,您将匹配更改为" lazy"模式。这意味着它匹配尽可能少的字符数。
答案 1 :(得分:2)
正则表达式的默认行为,使字符串中的尽可能长匹配。这被称为“贪婪”。
你是正确的?
通常只是意味着匹配前面的项目(例如,字符)一次或多次,但*?
是一个称为“懒星”的特殊情况,它切换正则表达式评估者进入“懒惰”模式。在这种模式下,评估者首先尝试跳过前面的项目(并在没有它的情况下完成匹配),然后“返回”它。
最终结果正是您所观察到的:它将匹配满足搜索条件的较短字符串而不是(默认值),从而找到最长的匹配。
答案 2 :(得分:1)
这是因为,
()是对结果进行分组(这是您希望获得的结果)。
。匹配。
* 让匹配出现0次或更多次。
?是可选的,因此, ab?会出现 a 或 ab 。
最后,(.*?)
将匹配所有内容,但只有一次(?
正在工作)或所有内容都是0次或更多次(*
正在工作)。
答案 3 :(得分:0)
当*之后是?这使得*在懒惰模式下匹配。默认情况下它贪婪:尽可能多地吸收匹配的字符。在惰性模式下,它会尽可能早地继续使用其余模式。
首先是错误的方式。现在纠正了。