如何在RegEx中拥有多个可选组

时间:2015-03-22 13:50:32

标签: java regex

String regex = "^-admin -s ([^\\s]+) -port (\\d{4}) -u ([^\\s]+) -p ([^\\s]+) -konf +([^\\s]+.xml)(-pause)?( -start)?( -stop)?( -save)?( -clean)?( -stat)?( -upload datoteka)?( -download datoteka)?$";

我需要在启动程序时捕获我给出的参数。我总是需要一些参数,我知道如何获得它们,但我有一个可选参数,可以有很多不同的单词。

我使用我放入参数的组来检查是否只使用了一个可选参数并调用了我需要的命令(基本上我计算后面的组和-konf以及如果有多于1我写错误信息)但我想知道我是否只能使用正则表达式使最后一个参数多选。例如,用户应该能够编写任何这些参数。

-pause | -start | -stop | -save | -clean | -stat | -upload fileName | -download fileName

示例:

-admin -s localhost -port 8000 -u username -konf file.xml -pause
-admin -s localhost -port 8000 -u username -konf file.xml -save
-admin -s localhost -port 8000 -u username -konf file.xml -clean

这些应该通过,并且下面的例子不应该导致在-konf之后有多个命令。

-admin -s localhost -port 8000 -u username -konf file.xml -pause -save
-admin -s localhost -port 8000 -u username -konf file.xml -pause -clean

这可以仅使用正则表达式完成吗?

1 个答案:

答案 0 :(得分:1)

(缩写)正则表达式,用于匹配多个选项,其中整个组是可选的:

( -(pause|start|download [^ ]+))?

匹配:

-pause
-start
-download filename
// matches nothing too

但不是:

-pause -start

说明:

由括号|中的管道()分隔的文本使管道之间的每个组成为可选匹配项。例如:(a|b|c)可以读取:匹配字母“a”“b”“c”。 (“ab”“d”不匹配。)

问号?使其前面的内容可选。如果之前的角色不是近距离),那么问号只会使该角色成为可选。可以阅读ab?:匹配字母“a”,或匹配“a”后跟字母“b” 。 (“ac”不匹配。)

如果问号? 前面有一个关闭的paren ),那么问号会在关闭的paren和它匹配的开放paren {{1}之间产生一切。 } 可选的。可以阅读(:匹配字母 a ,或匹配“a”后跟字母“b”和< EM> “C”。 (“ab”“ac”“abd”不匹配。)

所以我们将这些放在一起:a(bc)?可以读取匹配字母“a”“b”“c”< / em>或者根本没有。