gpt4 book ai didi

java - 在Java中解析管道分隔的字符串(管道可以转义)

转载 作者:行者123 更新时间:2023-12-01 07:08:34 24 4
gpt4 key购买 nike

接收一个管道分隔的参数,需要对其进行分词;但管道可以用\| 转义表明它不是分隔符,而是 token 的一部分。我知道 Java 编译器使用字符串中的“和转义引号\”来执行此操作。

但不确定是否有一个好的实用函数/算法来标记这样的字符串。输出将是字符串列表。

示例输入 1:"jk|g4",输出:"jk", "g4"(包含 2 个字符串的列表)

示例输入 2:"j\|k|g4|b",输出:"j|k", "g4", "b"(列出3 个字符串和文字管道)

尝试使用String.indexOf("|"),然后检查前一个字符是否为\...但有错误并想确定:是否有更简单的方法?正则表达式?

这是我所拥有的:

import java.util.ArrayList;
import java.util.List;

public class PasrePipes {
public static void main(String[] args) {

String in = "j\\|k|g4|b";
{
String[] ex = { "j|k", "g4", "b" };
tst(in, ex);
}

in = "j|k|g4|b";
{
String[] ex = { "j", "k", "g4", "b" };
tst(in, ex);
}
}

private static void tst(String in, String[] ex) {
System.out.println("----\n" + in);
List<String> toks = parse(in);
if (toks.size() != ex.length) {
System.out.println("size mismatch, got :" + toks.size() + " exp " + ex.length);
}
for (int i = 0; i < ex.length; i++) {
if (toks.size() > i) {
String n = toks.get(i);
if (!ex[i].equals(n)) {
System.out.println(" mismatch :" + i + ", got :" + n + "; exp :" + ex[i]);
} else {
System.out.println(" okay :" + i + "; exp :" + ex[i]);
}
}
}

System.out.println("--");
}

private static List<String> parse(String in) {
List<String> tokens = new ArrayList<String>();
int i = in.indexOf('|');
int old = 0;

while (i > -1) {
if (i > 0) {
if (in.charAt(i - 1) == '\\') {
i = in.indexOf('|', i + 1);
continue;
}
}
String s = in.substring(old, i);
s.replace("\\|", "|");
tokens.add(s);
old = i + 1;
i = in.indexOf('|', i + 1);

}
if(i > 0 && i < (in.length() - 1)) {
String s = in.substring(i + 1);
s.replace("\\|", "|");
tokens.add(s);
}
return tokens;

}
}

最佳答案

无法使用单个正则表达式语句同时执行拆分和替换。但你可以使用消极的眼光来分割:

(?<!\\)[\|]

然后将 \| 替换为 |

String value = "j\\|k|g4|b";
String[] split = value.split("(?<!\\\\)(\\|)");
for(int i = 0; i < split.length; i++){
split[i] = split[i].replaceAll("(\\\\\\|)", "\\|");
System.out.println(split[i]);
}

输出:

j|k
g4
b

更新

请注意,如果您直接在管道之前转义斜线,则这将不起作用。

String value = "j\\\\|k|g4|b";
...

输出:

j\|k
g4
b

期望的输出:

j\
k
g4
b

由于 Java 不支持可变长度后向查找,因此无法在分隔符上分割字符串。不过,您可以使用 PatternMatcher 来匹配分隔符前有偶数个斜杠的每个字段。

String value = "j\\|k|g4|b|kjbk\\\\\\|\\ml|jbkjbjk\\\\\\\\|k\\jb\\k\\\\\\j|m\\\\\\|\\\\kb";
Pattern pattern = Pattern.compile("(([^\\\\](\\\\\\\\)*\\\\\\|)|([^\\|]))+");
Matcher matcher = pattern.matcher(value);
List<String> fields = new ArrayList<String>();
while(matcher.find()){
String field = matcher.group().replaceAll("(\\\\\\|)", "\\|");
fields.add(field);
System.out.println(field);
}

输出:

j|k
g4
b
kjbk\\|\ml
jbkjbjk\\\\
k\jb\k\\\j
m\\|\\kb

关于java - 在Java中解析管道分隔的字符串(管道可以转义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18448638/

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