java正则表达式,匹配列表中的零或一个参数
String regex = "^-admin -s ([^\\s]+) -port (\\d{4}) -u ([^\\s]+) -konf +([^\\s]+.xml)( -pause)?( -start)?( -stop)?( -save)?( -clean)?( -stat)?( -upload [^ ]+)?( -download [^ ]+)?$";
我需要在程序启动时捕捉参数。初始参数是必需的,但我有一个可选参数,如果提供,需要从特定列表中选择
我使用我放入参数的组来检查可选参数是否存在,以及是否只有一个。如果是这样,我将使用该参数的名称来调用关联的命令。基本上,我会计算-konf
参数(和xml文件名)后面的组,如果有多个参数,我会写一条错误消息
我是否可以只使用regex将最后一个参数设置为可选参数,并且只使用列表中的一个参数?例如,用户应该能够写入以下任何一个参数:
-pause
-start
-stop
-save
-clean
-stat
-upload datoteka
-download datoteka
例如:
// pass
-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 -upload datoteka
这些应该通过,但下一个示例不应该通过,因为-konf
参数后面有多个命令
// fail
-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 楼答案
下面是一个正则表达式,它匹配一组选项中的零或一选项:
匹配以下任一项:
但不是:
解释:
括号内用the pipe symbol
|
分隔的文本()
使管道之间的每组成为可选匹配。例如:(a|b|c)
可以读为:匹配字母“a”或“b”或“c”。(“ab”和“d”不匹配。)A question mark
?
使前面的内容成为可选的。如果前一个字符不是一个封闭的paren)
,则问号仅使该字符成为可选字符ab?
可以读为:匹配字母“a”,或者匹配字母“a”,后跟字母“b”。(“ac”不匹配。)如果问号
?
前面有一个关闭参数)
,那么问号会使关闭参数与其匹配的打开参数(
之间的所有内容都是可选的a(bc)?
可以读取:匹配字母a,或者匹配字母“a”,后跟字母“b”和“c”。(“ab”和“ac”和“abd”不匹配。)所以我们把它们放在一起:
((a|b|c))?
可以读匹配字母“a”或“b”或“c”或什么都不读