簡體   English   中英

如何使用java獲取帶有選項值的特定子字符串

[英]How to get specific substring with option vale using 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);
    }
}

您應該使用正則表達式以更一般的方式檢測該選項。 如果你想要一個快速修復,你可以在你的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();
     }
   }
}

使用正則表達式,如本例所示

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或總是逃離整個路徑並檢查下一個"將出現的時間。

正如在這個答案中指出的,你可以使用任何好的命令行參數解析器,如:

更多關於命令的問答,比如參數: 這個這個

絕對使用正則表達式,我的答案如下

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;
}

基本上,我從點后第一個'\\'搜索第一個空格,並提取這個子字符串,如果有一個,使用捕獲組過濾引號
因此,此子字符串在此cmd字符串中的位置無關緊要

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM