1

为了".*?([a-m/]*).*"匹配 string "fall/2005",我认为".*"它将匹配任何字符 0 次或更多次。但是,由于有?follow .*,它只匹配 0 或 1 次重复。所以我认为.*?会匹配'f',但我错了。

我的逻辑有什么问题?

4

4 回答 4

10

如果我可以这样称呼它并使匹配成为最不可能的匹配(称为“惰性”) ,?则此处充当“修饰符”,.*直到模式中的下一个匹配。

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

于 2013-10-04T05:02:24.520 回答
3

在正则表达式中:

? :不发生或发生一次,?{0,1} 的缩写

* ? : ? 在量词使其成为不情愿的量词后,它会尝试找到最小的匹配项。

于 2013-10-04T04:58:00.180 回答
1

假设如果您有这样的字符串输入

this is stackoverflow

你使用正则表达式

.*

所以输出将是

this is stackoverflow

但是如果你使用正则表达式

.*?

你的输出将是

this

所以从上面的例子很明显,如果你使用 .* 它会给你整个字符串。为了防止这种情况发生,如果你只想要空间前的第一个 cherector,你应该使用.*?

更多实用知识可以查看http://regexpal.com/

于 2013-10-04T05:06:04.587 回答
1

?问号)在这里被认为是惰性的或所谓的不贪婪

你的正则表达式:

.*?         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)
于 2013-10-04T05:12:20.170 回答