使用'?'的懒惰正则表达式背后的逻辑?

时间:2013-01-23 21:35:01

标签: regex lazy-evaluation greedy regex-greedy non-greedy

这是我的问题:

例如,如果您的模式是:

ABC吗

然后这将匹配: 的 AB ABC 但不是 abd 作为c?意思是:如果有c,匹配,如果没有,不用担心..

所以说你有这样的事情:

- > sometext< - > somemoretext< -

如果你有这样的模式:(这是贪婪的) - >。*< - 然后它只会匹配:

- > sometext< - > sometext< -

但是如果你的模式很懒: - >。*?< - 然后它将匹配: - > sometext< - AND - > sometext< - ...

如果,?意味着,像wheter / not(如第一个例子中),那么第二个例子背后的逻辑是什么,有人能解释一下吗? 它为什么停在 - > sometext-<如果模式是。*?

3 个答案:

答案 0 :(得分:2)

?在不同的背景下意味着不同的东西。

事实上,c??是一个有效的表达式 - 只有在您必须时才会匹配'c'。

问号实际上有两个以上的含义。例如:

答案 1 :(得分:2)

?放在*或+或?之后?让它变得懒惰。如同,它将尝试匹配0个字符,然后如果失败则为1个字符,然后如果失败则为2个字符...而不是匹配MAX字符,如果失败则为MAX-1,如果失败则为MAX-2 .. 。默认情况下这是行为 - '贪婪',并希望尽可能多地匹配。

答案 2 :(得分:1)

在此背景下使用时:

abc?

然后你匹配a,b和c(如果它存在)。在此上下文中使用时:

->.*?<-

然后,您将匹配->后跟并包含所有内容,直到第一次出现<-。而不是:

->.*<-

这意味着匹配->后跟可选的无限数量的任何字符,加上<-。当然,在这种情况下,.*会吞噬<-