java - Java 的 shlex 替代品

标签 java bash shell tokenize

是否有 Java 的 shlex 替代品?我希望能够像 shell 处理它们一样拆分引号分隔的字符串。例如,如果我发送:

one two "three four"
并执行拆分,我想收到 token
one
two
three four

最佳答案

我今天遇到了类似的问题,看起来像 StringTokenizer、StrTokenizer、Scanner 等任何标准选项都不适合。但是,实现基础知识并不难。

此示例处理当前对其他答案发表评论的所有边缘情况。请注意,我还没有检查它是否完全符合 POSIX。要点包括可用的单元测试 on GitHub - 通过未经许可在公共(public)领域发布。

public List<String> shellSplit(CharSequence string) {
    List<String> tokens = new ArrayList<String>();
    boolean escaping = false;
    char quoteChar = ' ';
    boolean quoting = false;
    int lastCloseQuoteIndex = Integer.MIN_VALUE;
    StringBuilder current = new StringBuilder();
    for (int i = 0; i<string.length(); i++) {
        char c = string.charAt(i);
        if (escaping) {
            current.append(c);
            escaping = false;
        } else if (c == '\\' && !(quoting && quoteChar == '\'')) {
            escaping = true;
        } else if (quoting && c == quoteChar) {
            quoting = false;
            lastCloseQuoteIndex = i;
        } else if (!quoting && (c == '\'' || c == '"')) {
            quoting = true;
            quoteChar = c;
        } else if (!quoting && Character.isWhitespace(c)) {
            if (current.length() > 0 || lastCloseQuoteIndex == (i - 1)) {
                tokens.add(current.toString());
                current = new StringBuilder();
            }
        } else {
            current.append(c);
        }
    }
    if (current.length() > 0 || lastCloseQuoteIndex == (string.length() - 1)) {
        tokens.add(current.toString());
    }

    return tokens;
}

关于java - Java 的 shlex 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1082953/

相关文章:

java - 如何通过 OpenNLP 从 HTML 格式的电子邮件文件中提取数据?

c - 带有 fork 和 exec 的简单 shell

shell - Makefile 中 shell 脚本行输出的重定向

java - 尝试解析具有重复属性名称的 xml

java - 获取RecyclerView的总高度

java - Spring 中是否有等效于 CDI 的 @Default 限定符?

linux - 用于过滤掉日志中不相邻的重复项的 Bash 脚本

bash - 在 WSL Ubuntu 中使用 Chocolatey VS Code

mysql - bash shell脚本,创建mysql数据库和用户时遇到问题

linux - Bash 脚本将工作目录更改为它所在的目录