在java中有regexp这样的问题。我编码聊天应用程序和客户端只能发送到服务器“消息”或“\命令值”。我想解析这个字符串,检查是否是一行命令。如果是登录 - 值是必需的,但是如果它注销value.required应该是false。我创建了这样的正则表达式
"^\\\\(?<comm>login|status|((?=logout)))\\s(?<content>\\w+)"
我应该写什么注销条件?我想在comm组中注销。我应该写 像登出时的东西比不读取其他任何后续步骤的东西。
答案 0 :(得分:2)
最好让参数可选:
^\\(?<command>login|status|logout)(?:\s(?<param>\w+))?
并使用Java检查结果的逻辑。
如果你真的想要使用正则表达式,你可以这样做:
^\\(?<command>login|status|logout(?=$))(?:\s(?<param>\w+))?$
答案 1 :(得分:1)
我可能会检查某个命令是否应该在通用代码(即Java)中而不是在正则表达式中具有参数。也就是说,正则表达式适用于标记化,但对解析不是很好。
但是,如果你有充分的理由这样做,那么我可能会将表达式分成两部分 - 一部分命令需要命令,另一部分则不需要命令。例如:
^\\(?:(?<command>login)\s+(?<param>\w+)|(?<command>status|logout)(?<param>))$
请注意,最终的(?<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
)$