我尝试使用该正则表达式/^(\S+)(?:\?$|$)/
yolo
和yolo?
适用于两者,但在第二个字符串(yolo?
)上,?
将包含在捕获组(\S+)
上。
这是正则表达式的错误还是我犯了一些错误?
编辑:我不想要'?'包含在捕获组中。我的英语很差。
答案 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]+)\??$
OR
^([\w]+)\??$
如果您使用\S+
,它也会匹配?
字符。因此,要分隔单词和非单词字符,您可以使用上面的正则表达式。它只捕获单词字符并匹配可选的?
,后跟一个或多个单词字符。
答案 2 :(得分:2)
这是正确的回复,因为\S+
贪婪地匹配一个或多个非空白字符,其中?
是一个。
因此问号在(\S+)
组中匹配,非捕获组解析为$
您可以通过使匹配非贪婪而使其按预期工作:
/^(\S+?)(?:\?$|$)/
或者你可以限制字符组:
/^([^\s?]+)(?:\?$|$)/
答案 3 :(得分:2)
让+
非贪婪:
^(\S+?)\??$
答案 4 :(得分:2)
这样做是因为\S
匹配任何非空格字符并且贪婪。
+
量词与?
匹配^(\S+?)\??$
匹配将阻止此操作。
\w
或者在这里使用^(\w+)\??$
匹配任何单词字符。
{{1}}