gpt4 book ai didi

java - Java 的 shlex 替代品

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:23 24 4
gpt4 key购买 nike

是否有 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/

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