0

我正在尝试将许多参数传递给我的 Java 应用程序,但我想自己使用智能解析器来解析它们,该解析器不仅仅依赖空格来分隔参数。一个例子:

/更新源=foo func=(bar, foo ,foo,bar)

通过将所有内容转换为令牌然后解析它们,这一切都很好。但是,当我添加时出现问题:

path="./foo/bar/foo bar.txt"

(注意 foo 和 bar 之间的双倍空格)。

当我使用双引号时,参数作为单个字符串传递,保留双空格。尽管像这样删除引号:

路径=./foo/bar/foo bar.txt

这使我的解析器失败。但是当我尝试使用其他字符作为引号时,例如',解析器工作正常,但是shell将字符串作为两个单独的字符串传递,在双空格处分隔,因此我丢失了那里有两个空格的信息.

我可以做些什么来使用双引号传递参数以保留文字字符串表示,同时保留字符串被引用的信息,而无需用户键入像“'string'”这样的奇怪结构?我正在使用Java,也许有一种方法可以让外壳不解析整行参数?或者只是没有删除引号?

顺便说一句,我从微软命令行运行它,还没有尝试过 unix shell,它甚至可能在我在互联网上读到的单引号上失败

4

2 回答 2

1

在 Windows 命令行(使用cmd.exe)上,您可以使用 . 转义双引号\"。例如,

java MyApp path=\"./foo/bar/foo bar.txt\"

将导致

args[0] = path="./foo/bar/foo
args[1] = bar.txt"

尽管

java MyApp path="\"./foo/bar/foo  bar.txt\""

会给你

args[0] = path="./foo/bar/foo  bar.txt"
于 2013-02-20T14:42:59.973 回答
0

感谢我得到的帮助,但我已经想通了:

  • 我知道可以引用的内容不包含括号、逗号或等号,我的解析器可以识别这些内容。

  • 我知道如果引用了某些内容并且它包含空格,那么这些空格仍将存在于 split 参数中。

  • 我知道原始参数字符串在空格的每个区域都被拆分,因此最终拆分参数不包含空格,仅包含引号部分中的空格。

因此我可以假设,如果我解析一个拆分参数,其中的任何空间并不意味着必须生成一个新的令牌,因此它会保留在最终的字符串令牌中。

我现在只需要重写我的标记器来接受一个参数数组,而不是我现在从我在 main() 方法中传递的 args 数组创建的连接字符串。这样我就可以区分跳过真正的空格(进入数组的下一个元素)和引用的空格(任何其他空格)。

于 2013-02-21T13:27:26.413 回答