1

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

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

我应该写什么来注销条件?我想在通讯组中注销。我应该写一些类似 if logout 的东西,而不是阅读之后的任何其他内容。

4

2 回答 2

2

您最好将参数设为可选:

^\\(?<command>login|status|logout)(?:\s(?<param>\w+))?

并使用 Java 检查结果的逻辑。

如果你真的想使用正则表达式,你可以这样做:

^\\(?<command>login|status|logout(?=$))(?:\s(?<param>\w+))?$
于 2012-06-11T17:36:22.210 回答
1

我可能会检查某个命令是否应该在通用代码(即Java)中而不是在正则表达式中具有参数。也就是说,正则表达式有利于分词,但不利于解析。

但是,如果您有充分的理由这样做,那么我可能会将表达式分成两部分 - 一个命令需要命令,另一个不需要命令。例如:

^\\(?:(?<command>login)\s+(?<param>\w+)|(?<command>status|logout)(?<param>))$

请注意,final(?<param>)并不是正则表达式正确运行所必需的,它只是为了让任何后续代码都可以依赖结果中的两个命名组:commandparam

从逻辑上讲,这可以扩展到三组,其中第三组包含带有可选参数的命令。

如果您将 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
)$
于 2012-06-11T17:50:06.007 回答