为了".*?([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
^^
因此,.*?匹配aawhileab将匹配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)