我有一个带有多个可选捕获组的正则表达式。
notify (?<action>[^\s]+)(?:(?<query>(?:(?! by ).)*))(?: by (?<id>\w+))?
我用来匹配的字符串是:
notify enable
notify disable
notify add hello
notify remove hello how are you
notify add 983734987 by id
notify remove hello by id
notify add hello by name
notify remove hello by name
如您所见,action
将是enable
,disable
,add
或remove
。 query
应该为空,hello
,hello how are you
或983734987
,但它总是会占用前导空格,id
要么为空,{{1} }或id
。
我可以做一些更简单的正则表达式,但是看起来像这样我很难理解。我尝试将name
放在^\s
附近,因此它没有前导空格,但似乎无法使其正常工作。
因此,我需要query
捕获组来放弃要捕获的前导空白。任何帮助都会很棒。
答案 0 :(得分:1)
我会将action
之后的所有内容都放入一个可选组,并对查询使用惰性重复,而不是(贪婪重复与否定超前结合),我认为它更具可读性。
请注意\s
,因为它可以匹配换行符,这在此处可能是不希望的。您可以使用[^\s]+
而不是\S+
。 (\S
是\s
的取反)
^notify (?<action>\S+)(?: +(?<query>.+?)(?: by (?<id>\w+))?)?$