我尝试使用该正则表达式 /^(\S+)(?:\?$|$)/
使用 yolo
和 yolo?
两者都适用,但在第二个字符串 ( yolo?
) 上, ?
将包含在捕获组 (\S+)
中。
这是正则表达式的错误还是我犯了一些错误?
编辑:我不想要那个“?”包含在捕获组中。 Sry 我的英语不好。
最佳答案
您可以使用
?
,请使用否定字符类 [^...]
(请参阅 demo here ):^([^\s?]+)\??$
?
(例如,yolo?yolo?
并且你想要yolo?yolo
),您需要通过添加 +
使您的量词 ?
lazy (参见 demo here ):^(\S+?)\??$
(?=...)
代替并查看整个匹配(请参阅 demo here ):^[^\s?]+(?=\??$)
发生了什么
规则是:量词(如
+
)默认为 greedy,正则表达式引擎将返回它找到的第一个匹配项。考虑这在这里意味着什么:
\S+
将首先匹配 yolo?
中的所有内容,然后引擎将尝试匹配 (?:\?$|$)
。 \?$
失败(我们已经在字符串的末尾,所以我们现在尝试匹配一个空字符串并且没有剩下的 ?
),但是 $
匹配。 正则表达式已成功结束,引擎返回匹配项,其中
\S+
已匹配所有字符串并且所有内容都在第一个捕获组中。要匹配您想要的内容,您必须使量词懒惰(
+?
),或防止字符类(是的, \S
是一个字符类)匹配您的结束分隔符 ?
(例如,使用 [^\s?]
)。关于php - 正则表达式组包括 if 条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24453096/