簡體   English   中英

在Java中拆分命令行

[英]Splitting a command line in Java

在Java中解析類似shell的命令行的推薦方法是什么。 我並不是說當它們已經是數組形式時處理選項(例如處理“-x”等),已經有很多問題和答案。

不,我的意思是將完整的命令字符串拆分為“令牌”。 我需要轉換一個字符串,如:

user 123712378 suspend "They are \"bad guys\"" Or\ are\ they?

...到列表/數組:

user
123712378
suspend
They are "bad guys"
Or are they?

我目前只是在空白上進行拆分,但顯然無法處理引號和轉義空格。

(引用處理是最重要的。逃脫的空間會很棒)

注意:我的命令字符串是來自類似shell的Web界面的輸入。 它不是從main(String[] args)構建的

你需要的是實現有限自動機。 您需要逐個字符地讀取字符串,並根據您的下一個或上一個字符找到下一個狀態。
例如, "指示字符串的開頭,但如果它前面有一個\\保持當前狀態不變,並讀取直到下一個將您帶到下一個狀態的令牌。
即基本上在你的例子中你會有

read string -> read number   
      ^  -    -   -  |  

您當然需要定義影響或不影響您的州的所有州和特殊字符。
說實話,我不確定你為什么要為最終用戶提供這樣的功能。
傳統上所有的cli程序都接受標准格式的輸入-x or --x or --x=s等。
這種格式對於典型用戶來說是眾所周知的,並且易於實現和測試正確。
傳統上,如果我們需要為用戶提供更多“靈活”的輸入,最好構建一個GUI。 這就是我的建議。

DrJava的ArgumentTokenizer以Bourne shell及其衍生產品的方式解析命令行

它正確地支持轉義,所以bash -c 'echo "\\"escaped '\\''single'\\'' quote\\""'被標記為[bash, -c, echo "\\"escaped 'single' quote\\""]

將args []重新構建為字符串,然后使用regexp進行標記:

public static void main(String[] args) {
    String commandline = "";
    for(String arg : args) {
        commandline += arg;
        commandline += " ";
    }
    System.out.println(commandline);

    List<String> list = new ArrayList<String>();
    Matcher m = Pattern.compile("([^\"]\\S*|\".+?\")\\s*").matcher(commandline);
    while (m.find())
        list.add(m.group(1)); // Add .replace("\"", "") to remove surrounding quotes.


    System.out.println(list);
}

后一部分我從這里開始

暫無
暫無

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

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