我尝试使用该正则表达式 /^(\S+)(?:\?$|$)/
使用 yoloyolo?
两者都适用,但在第二个字符串 ( yolo? ) 上, ? 将包含在捕获组 (\S+) 中。

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

编辑:我不想要那个“?”包含在捕获组中。 Sry 我的英语不好。

最佳答案

您可以使用

  • 如果要捕获的内容中没有 ?,请使用否定字符类 [^...](请参阅 demo here ):
    ^([^\s?]+)\??$
    
  • 如果你想捕获的内容可以包含 ?(例如,yolo?yolo? 并且你想要yolo?yolo ),您需要通过添加 + 使您的量词 ? lazy (参见 demo here ):
    ^(\S+?)\??$
    
  • 顺便说一句,这里不需要捕获组,您可以使用 look ahead (?=...) 代替并查看整个匹配(请参阅 demo here ):
    ^[^\s?]+(?=\??$)
    

  • 发生了什么

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

    考虑这在这里意味着什么:
  • \S+ 将首先匹配 yolo? 中的所有内容,然后引擎将尝试匹配 (?:\?$|$)
  • \?$ 失败(我们已经在字符串的末尾,所以我们现在尝试匹配一个空字符串并且没有剩下的 ?),但是 $ 匹配。

  • 正则表达式已成功结束,引擎返回匹配项,其中 \S+ 已匹配所有字符串并且所有内容都在第一个捕获组中。

    要匹配您想要的内容,您必须使量词懒惰( +? ),或防止字符类(是的, \S 是一个字符类)匹配您的结束分隔符 ? (例如,使用 [^\s?] )。

    关于php - 正则表达式组包括 if 条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24453096/

    10-10 08:12