gpt4 book ai didi

java - 如何以与 bash 相同的方式解析命令行序列?

转载 作者:行者123 更新时间:2023-11-30 03:19:44 24 4
gpt4 key购买 nike

输入

我有以下示例输入(每个都是 bash 可执行命令):

client-properties create mode "publisher" "version" "mode"
client-properties set "publisher" "version" "mode" "prop1" "value
value
value"
client-properties set "publisher" "version" "mo\"de" "prop2" "שלום עליכם"

输出

由此,我想将其解析为 3 个 String[],如下所示:

{"client-properties", "create", "mode", "publisher", "version", "mode"}
{"client-properties", "set", "publisher", "version", "mode", "prop1", "value\nvalue\nvalue"}
{"client-properties", "set", "publisher", "version", "mo\"de", "prop2", "שלום עליכם"}
// (mo"de)

要求

硬性要求如下:

  • 换行符表示新语句。
  • 空格表示单个参数。
  • 用双引号 (") 分隔的参数被视为单个参数,即使它包含空格或换行符
  • \" 转义序列可用于在参数中插入文字双引号
  • 允许使用 Unicode 字符(假设 UTF8 是安全的)。

我尝试过的

我研究过正则表达式,但它变得非常复杂,速度非常快。我调查过StringTokenizer (这显得非常原始)和StreamTokenizer (这不能很好地处理 unicode)。

如果可能的话,我想避免手动编写解析器。

对此有什么想法吗?我最新的尝试如下:

public static List<String> tokenize(String s) {
List<String> opts = new ArrayList<>();
try (StringReader sr = new StringReader(s)) {
StreamTokenizer st = new StreamTokenizer(sr);
st.resetSyntax();
// From ! to end of ascii range. But alas, no unicode
st.wordChars(31, 127);
st.quoteChar('\"');
st.whitespaceChars(32, 32);
while (st.nextToken() != StreamTokenizer.TT_EOF) {
opts.add(st.sval);
}
} catch (IOException e) {}

return opts;
}

最佳答案

您可以尝试使用 opencsv 库,使用 gradle 导入,例如:

compile 'net.sf.opencsv:opencsv:3.4'

尝试类似于以下程序的操作:

import com.opencsv.CSVReader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

private static final char SEPARATOR = ' ';
private static final char QUOTE_CHAR = '"';
private static final char ESCAPE = '\\';

public static void main(String[] args) throws IOException {
List<String[]> result = new ArrayList<>();

CSVReader reader = new CSVReader(
new FileReader(args[0]),
SEPARATOR,
QUOTE_CHAR,
ESCAPE);

result.addAll(reader.readAll());

for (int i = 0; i < result.size(); i++) {
System.out.println(Arrays.toString(result.get(i)));
}

}

}

结果是:

[client-properties, create, mode, publisher, version, mode]
[client-properties, set, publisher, version, mode, prop1, value
value
value]
[client-properties, set, publisher, version, mo"de, prop2, שלום עליכם]

关于java - 如何以与 bash 相同的方式解析命令行序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31635901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com