如何使用java获取带有选项vale的特定子字符串

如何使用java获取带有选项vale的特定子字符串,java,Java,我有一个字符串,我想从这个字符串中获取密码文件路径,该路径由一个选项(-sn)标识 上面的行是一个配置行,可以是-sn或-n。 请建议如何从上面的字符串中获取D:\workdir\PV_81\config\sum81pv.pwf行,或者该字符串可能带有引号 下面是我的代码,它只检查-sn选项,但我想使用-sn或-n进行检查 if ( s.matches( "^\\s*msql.*$" ) ) { StringTokenizer st = new StringTokenizer( s,

我有一个字符串,我想从这个字符串中获取密码文件路径,该路径由一个选项(-sn)标识

上面的行是一个配置行,可以是
-sn
-n
。 请建议如何从上面的字符串中获取
D:\workdir\PV_81\config\sum81pv.pwf
行,或者该字符串可能带有引号

下面是我的代码,它只检查-sn选项,但我想使用-sn或-n进行检查

if ( s.matches( "^\\s*msql.*$" ) ) 
 {
   StringTokenizer st = new StringTokenizer( s, " " );
   while ( st.hasMoreTokens() )
   {
     if ( st.nextToken().equals( "-sn" ) )
     {
       pwf = st.nextToken();
     }
   }
}
我想使用StreamTokenizer而不是StringTokenizer类,并获取
D:\workdir\PV_81\config\sum81pv.pwf

此路径中可能包含空格

String s = "msqlsum81pv 0 0 25 25 25 2  -sn D:\workdir\PV_81\config\sum81pv.pwf -C 5000"



if ( s.matches( "^\\s*msql.*$" ) ) 
 {
   StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));
   while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) 
    {

       System.out.println(tokenizer.sval);
    }
}

您应该使用正则表达式以更一般的方式检测该选项。如果需要快速修复,可以在If中使用
运算符,但每次出现新操作时,If都会增长,这是个坏主意

if ( s.matches( "^\\s*msql.*$" ) ) 
 {
   StringTokenizer st = new StringTokenizer( s, " " );
   while ( st.hasMoreTokens() )
   {
     string token = st.nextToken();
     if ( token.equals( "-sn" ) || token.equals("-n" ) )
     {
       pwf = st.nextToken();
     }
   }
}

使用正则表达式,如本例所示

public static void main(String[] args) {
    System.out.println(findString("msqlsum81pv 0 0 25 25 25 2  -sn D:\\workdir\\PV_81\\config\\sum81pv.pwf -C 5000"));
    System.out.println(findString("msqlsum81pv 0 0 25 25 25 2  -s D:\\workdir\\PV_81\\config\\sum81pv.pwf -C 5000"));
    System.out.println(findString("msqlsum81pv 0 0 25 25 25 2  -sn \"D:\\workdir\\PV_81\\config\\sum81pv.pwf\" -C 5000"));
    System.out.println(findString("msqlsum81pv 0 0 25 25 25 2  -s \"D:\\workdir\\PV_81\\config\\sum81pv.pwf\" -C 5000"));

}

private static String findString(String inputCommand) {
    String path;
    if(inputCommand.matches(".*(-sn|-s) \"+.*")) {
        path = inputCommand.replaceAll(".*(-sn|-s) \"?([^\"]*)?.*", "$2");
    } else {
        path = inputCommand.replaceAll(".*(-sn|-s) \"?([^ ]*)?.*", "$2");
    }
    return path;
}
O/p

编辑:注意,如果路径可能包含空格,则可能需要修改此选项。然后,您可能希望一直检查到
-C
,或者始终转义整个路径,并检查下一个
何时会出现。

如上所述,您可以使用任何好的命令行参数解析器,如:

  • Commons CLI

  • Java Gems

  • JArgs

  • GetOpt


关于类似命令的参数的更多问答:和。

肯定使用正则表达式,我的答案如下

public static String extractString(final String input) {
    String ret = null;
    final Pattern pattern = Pattern.compile("(..\\\\.*\\.*?)(?:\"?)\\p{Space}");
    final Matcher matcher = pattern.matcher(input);
    if (matcher.find()) {
        ret = matcher.group(1);
    }
    return ret;
}
基本上,我从第一个“\”搜索到点后的第一个空格,然后提取这个子字符串,如果有引号,则使用capture group过滤引号

因此,这个子字符串在这个cmd字符串中的位置无关紧要。@KevinEsche:-是的,但我没有找到解决方案。请你推荐一些正则表达式?可能与sidenote重复:如果路径包含空格,这将失败。@acostela:-如果字符串包含带引号的字符串,会发生什么情况msqlsum81pv 0 0 25 25 2-sn \“D:\workdir\PV_81\config\sum81pv.pwf \“-C 5000”@YogendraSharma请参见我的编辑。我假设如果它是
(.s \-sn)\”+
,它也以
结尾。如果没有
,我假设路径中没有空格,否则该命令将无效:-当路径包含空格时会发生什么情况。Ex:-“msqlsum81pv 0 0 25 25 2-sn D:\\work dir\\PV 81\\config\\sum81pv.pwf-C 5000”
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
public static String extractString(final String input) {
    String ret = null;
    final Pattern pattern = Pattern.compile("(..\\\\.*\\.*?)(?:\"?)\\p{Space}");
    final Matcher matcher = pattern.matcher(input);
    if (matcher.find()) {
        ret = matcher.group(1);
    }
    return ret;
}