正则表达式,组问题

时间:2012-06-11 17:34:04

标签: java regex

在java中有regexp这样的问题。我编码聊天应用程序和客户端只能发送到服务器“消息”或“\命令值”。我想解析这个字符串,检查是否是一行命令。如果是登录 - 值是必需的,但是如果它注销value.required应该是false。我创建了这样的正则表达式

"^\\\\(?<comm>login|status|((?=logout)))\\s(?<content>\\w+)"

我应该写什么注销条件?我想在comm组中注销。我应该写 像登出时的东西比不读取其他任何后续步骤的东西。

2 个答案:

答案 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
)$