为了".*?([a-m/]*).*"
匹配 string "fall/2005"
,我认为".*"
它将匹配任何字符 0 次或更多次。但是,由于有?
follow .*
,它只匹配 0 或 1 次重复。所以我认为.*?
会匹配'f'
,但我错了。
我的逻辑有什么问题?
如果我可以这样称呼它并使匹配成为最不可能的匹配(称为“惰性”) ,?
则此处充当“修饰符”,.*
直到模式中的下一个匹配。
in fall/2005
,第一个.*?
将匹配到第一个匹配 in ([a-m/]*)
,即之前f
的 。因此,.*?
匹配 0 个字符以便([a-m/]*)
匹配fall/
,并且由于([a-m/]*)
不再匹配,模式的下一部分.*
匹配字符串中剩余的内容,即2005
.
与 相比.*([a-m/]*).*
,您将.*
首先尽可能匹配(意味着整个字符串)并尝试返回以使其他术语匹配。除了问题在于其他量词也能够匹配 0 个字符,因此.*
仅此一项就可以匹配整个字符串(称为“贪婪”)。
也许一个不同的例子会有所帮助。
.*ab
在:
aaababaaabab
在这里,.*
将匹配尽可能多的字符,然后尝试匹配ab
. 因此,.*
将匹配aaababaaab
,余数将由 匹配ab
。
.*?ab
在:
aaababaaabab
在这里,.*?
将尽可能少地匹配,直到它可以匹配ab
该正则表达式。的第一次出现在ab
这里:
aaababaaabab
^^
因此,.*?
匹配aa
whileab
将匹配ab
。
在正则表达式中:
? :不发生或发生一次,?{0,1} 的缩写
* ? : ? 在量词使其成为不情愿的量词后,它会尝试找到最小的匹配项。
假设如果您有这样的字符串输入
this is stackoverflow
你使用正则表达式
.*
所以输出将是
this is stackoverflow
但是如果你使用正则表达式
.*?
你的输出将是
this
所以从上面的例子很明显,如果你使用 .* 它会给你整个字符串。为了防止这种情况发生,如果你只想要空间前的第一个 cherector,你应该使用.*?
更多实用知识可以查看http://regexpal.com/
(?
问号)在这里被认为是惰性的或所谓的不贪婪。
你的正则表达式:
.*? any character except newline \n (0 or more times)
(matching the least amount possible)
( group and capture to \1:
[a-m/]* any character of: 'a' to 'm', '/' (0 or more times)
(matching the most amount possible)
) end of \1
.* any character except newline \n (0 or more times)
(matching the most amount possible)