如何使用java

时间:2016-08-11 09:31:41

标签: java

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

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

以上行是一个配置行,可以是-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);
    }
}

4 个答案:

答案 0 :(得分:4)

您应该使用正则表达式以更一般的方式检测该选项。如果你想快速修复,你可以在你的if中使用OR运算符,但每次出现新操作时你的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();
     }
   }
}

答案 1 :(得分:2)

使用正则表达式,如本例中给出的

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

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

编辑:请注意,如果路径可能包含空格,则可能需要修改此项。然后,您可能需要检查,直到-C或全部逃离整个路径并检查下一个"何时出现。

答案 2 :(得分:2)

正如this answer所指出的那样,你可以使用任何好的命令行参数解析器,例如:

更多关于命令的Q& A:thisthis

答案 3 :(得分:0)

绝对使用正则表达式,我的答案在下面

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;
}
基本上,我从第一个搜索' \'在dot之后的第一个空格中,并提取此子字符串,如果有一个,则使用捕获组来过滤引号 因此,此子字符串在此cmd字符串中的位置无关紧要