正则表达集团包括if条件

时间:2014-06-27 13:30:56

标签: php regex preg-match

我尝试使用该正则表达式/^(\S+)(?:\?$|$)/

yoloyolo?

适用于两者,但在第二个字符串(yolo?)上,?将包含在捕获组(\S+)上。

这是正则表达式的错误还是我犯了一些错误?

编辑:我不想要'?'包含在捕获组中。我的英语很差。

5 个答案:

答案 0 :(得分:4)

您可以使用

  • 如果您要捕获的内容中不能包含?,请使用否定字符类[^...](请参阅demo here):

    ^([^\s?]+)\??$
    
  • 如果要捕获的内容中包含?(例如,yolo?yolo?并且您想要 yolo?yolo),您需要通过添加+来制作量词? lazy(请参阅demo here):

    ^(\S+?)\??$
    
  • 此处不需要捕获组,您可以使用look ahead (?=...)来查看整个匹配(请参阅demo here):

    ^[^\s?]+(?=\??$)
    

发生了什么

规则是:量词(如+)默认为greedy,正则表达式引擎将返回它找到的第一个匹配项。

考虑这意味着什么:

  • \S+将首先匹配yolo?中的所有内容,然后引擎将尝试匹配(?:\?$|$)
  • \?$失败(我们已经在字符串的末尾,所以我们现在尝试匹配一个空字符串并且没有留下?),但是{{ 1}}匹配。

正则表达式已经成功到达终点,引擎返回匹配,其中$已匹配所有字符串,并且所有内容都在第一个捕获组中。

要匹配你想要的东西你必须使量词惰性(\S+),或者阻止字符类(是的,+?是一个字符类)来匹配你的结束分隔符{{1} }(例如\S)。

答案 1 :(得分:2)

以下正则表达式会捕获所有非空格字符,后跟选项?

^([\S]+)\??$

DEMO

OR

^([\w]+)\??$

DEMO

如果您使用\S+,它也会匹配?字符。因此,要分隔单词和非单词字符,您可以使用上面的正则表达式。它只捕获单词字符并匹配可选的?,后跟一个或多个单词字符。

答案 2 :(得分:2)

这是正确的回复,因为\S+贪婪地匹配一个或多个非空白字符,其中?是一个。

因此问号在(\S+)组中匹配,非捕获组解析为$您可以通过使匹配非贪婪而使其按预期工作:

/^(\S+?)(?:\?$|$)/

demo

或者你可以限制字符组:

/^([^\s?]+)(?:\?$|$)/

demo

答案 3 :(得分:2)

+非贪婪:

^(\S+?)\??$

答案 4 :(得分:2)

这样做是因为\S匹配任何非空格字符并且贪婪

+量词与?匹配^(\S+?)\??$ 匹配将阻止此操作。

\w

或者在这里使用^(\w+)\??$ 匹配任何单词字符。

{{1}}