Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式、组和问题_Java_Regex - Fatal编程技术网

Java 正则表达式、组和问题

Java 正则表达式、组和问题,java,regex,Java,Regex,java中的regexp有这样的问题。I代码聊天应用程序和客户端可以只发送“消息”或“\command value”到服务器。我想解析这个字符串并检查是否有命令在该行中。如果它登录,则需要-value,但如果它注销,则value.required应为false。我创建这样的regexp "^\\\\(?<comm>login|status|((?=logout)))\\s(?<content>\\w+)" “^\\\\(?登录|状态|)(=注销))\\s(?\\w+”

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

"^\\\\(?<comm>login|status|((?=logout)))\\s(?<content>\\w+)"
“^\\\\(?登录|状态|)(=注销))\\s(?\\w+”
我应该写什么来满足注销条件?我想在通讯组中注销。我应该写
比如说,如果退出,就不要阅读后面的任何内容

您最好将参数设置为可选:

^\\(?<command>login|status|logout)(?:\s(?<param>\w+))?
^\\(?登录|状态|注销)(?:\s(?\w+)?
并使用Java检查结果的逻辑

如果您真的想使用正则表达式,可以执行以下操作:

^\\(?<command>login|status|logout(?=$))(?:\s(?<param>\w+))?$
^\\(?登录|状态|注销(?=$)(?:\s(?\w+))$

我可能会检查某个命令是否应该在通用代码(即Java)而不是正则表达式中包含参数。也就是说,正则表达式对于标记化很好,但对于解析却不太好

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

^\\(?:(?登录)\s+(?\w+)(?状态|注销)(?)$
请注意,正则表达式要正确运行,最终的
(?)
并不是严格必需的,它只是为了使任何后续代码都可以依赖结果中的两个命名组:command和param

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

如果将Groovy(或Java 7)用于多行字符串,则可以更清楚地这样编写:

^\\(?x:
(?登录)\s+(?\w+)#需要参数的命令
|#-或-
(?状态|注销)(?)#不需要参数的命令
)$

是的,我确信我可以用Java完成这项工作。但我整天都在寻找使用regexp.=)执行此操作的可能性,为什么要删除斜杠导致模式不理解?而且它不懂美元。它与它不匹配。@Igor,我写的是正则表达式字符串(如果你打印它的话,它会显示出来),只有在引用时才需要额外的反斜杠。可能是因为我使用了readline?或者修剪字符串并修剪“\n”?不允许我两次声明组名。我应该做两种模式吗?啊,对不起,伊戈尔。如果像这样的多个命名组在Java中不起作用,那么我建议使用@Qtax的解决方案。正则表达式非常简单,但一旦你必须开始在其中嵌入逻辑,你最好升级到更高级的语言。