我可能会检查某个命令是否应该在通用代码(即Java)中而不是在正则表达式中具有参数。也就是说,正则表达式有利于分词,但不利于解析。
但是,如果您有充分的理由这样做,那么我可能会将表达式分成两部分 - 一个命令需要命令,另一个不需要命令。例如:
^\\(?:(?<command>login)\s+(?<param>\w+)|(?<command>status|logout)(?<param>))$
请注意,final(?<param>)
并不是正则表达式正确运行所必需的,它只是为了让任何后续代码都可以依赖结果中的两个命名组:command和param。
从逻辑上讲,这可以扩展到三组,其中第三组包含带有可选参数的命令。
如果您将 Groovy(或 Java 7)用于多行字符串,则可以更清楚地写成这样:
^\\(?x:
(?<command>login) \s+ (?<param>\w+) # Commands that require a parameter
| # -or-
(?<command>status|logout) (?<param>) # Commands that do not require a parameter
)$