在Java中拆分命令行

Bar*_*lom 7 java parsing command-line-interface

在Java中解析类似shell的命令行的推荐方法是什么.我并不是说当它们已经是数组形式时处理选项(例如处理"-x"等),已经有很多问题和答案.

不,我的意思是将完整的命令字符串拆分为"令牌".我需要转换一个字符串,如:

user 123712378 suspend "They are \"bad guys\"" Or\ are\ they?
Run Code Online (Sandbox Code Playgroud)

...到列表/数组:

user
123712378
suspend
They are "bad guys"
Or are they?
Run Code Online (Sandbox Code Playgroud)

我目前只是在空白上进行拆分,但显然无法处理引号和转义空格.

(引用处理是最重要的.逃脱的空间会很棒)

注意:我的命令字符串是来自类似shell的Web界面的输入.它不是建立在main(String[] args)

Cra*_*lus 0

您需要的是实现一个有限自动机。您需要逐个字符读取字符串,并根据下一个或上一个字符找到下一个状态。
例如, a"表示字符串的开头,但如果它前面有 an ,\则保持当前状态不变并读取,直到下一个标记将您带到下一个状态。
即本质上在你的例子中你会

read string -> read number   
      ^  -    -   -  |  
Run Code Online (Sandbox Code Playgroud)

您当然需要定义所有状态以及影响或不影响您的状态的特殊字符。
老实说,我不确定您为什么要向最终用户提供此类功能。
传统上,所有 cli 程序都接受标准格式-x or --x or --x=s等的输入
。这种格式对于典型用户来说是众所周知的,并且易于实现和测试是否正确。
传统上如果我们需要为用户提供更“灵活”的输入,最好构建一个GUI。这就是我的建议。

  • 嗯,这很容易构建(我过去在其他情况下也这样做过),但我希望一些库已经修复了它。关于原因,我不只是构建命令本身(这就是 -x 等进来的地方,它们很可能在我的应用程序中执行),但我首先构建 shell 本身,高级用户通过以下方式输入命令字符串一个网络界面。 (3认同)