有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

  1. # 1 楼答案

    下面是一个正则表达式,它匹配一组选项中的选项:

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

    匹配以下任一项:

    -pause
    -start
    -download filename
    // or nothing
    

    但不是:

    -pause -start
    -delete
    -download
    -download file name with space
    

    解释:

    括号内用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”或什么都不读