如何在多个可选的捕获分组正则表达式中不包括前导空格

时间:2018-08-02 00:36:47

标签: regex

我有一个带有多个可选捕获组的正则表达式。

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将是enabledisableaddremovequery应该为空,hellohello how are you983734987,但它总是会占用前导空格,id要么为空,{{1} }或id

我可以做一些更简单的正则表达式,但是看起来像这样我很难理解。我尝试将name放在^\s附近,因此它没有前导空格,但似乎无法使其正常工作。

因此,我需要query捕获组来放弃要捕获的前导空白。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

我会将action之后的所有内容都放入一个可选组,并对查询使用惰性重复,而不是(贪婪重复与否定超前结合),我认为它更具可读性。

请注意\s,因为它可以匹配换行符,这在此处可能是不希望的。您可以使用[^\s]+而不是\S+。 (\S\s的取反)

^notify (?<action>\S+)(?: +(?<query>.+?)(?: by (?<id>\w+))?)?$

https://regex101.com/r/xdM3I8/2