gpt4 book ai didi

用于处理转义分隔符和转义转义字符的 Java String.split() 正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:22 26 4
gpt4 key购买 nike

String testString = "a\\,b\\\\,c,d\\\\\\,e,f\\\\g";
String[] splitedString = test.split(PATTERN_STRING);
for (String string : splitedString) {
System.out.println(string);
}

这里我有一个字符串,它将字符串列表编码为字符串,其中转义字符为\,分隔符为 ,
注意:(由于 Java 代码,示例中的反斜杠加倍)
反斜杠和逗号被转义在原始字符串和结果字符串中用逗号合并。我需要一个正则表达式来将此字符串拆分为原始字符串列表。
所以以字符串为例

"a\,b\\,c,d\\\,e,f\\g"
I need to get such strings:

"a\,b\\"
"c"
"d\\\,e"
"f\\g"

所以拆分的逻辑很简单:只有当它前面的反斜杠数量为偶数时才用分隔符逗号拆分:0,2,4 ...只有在这种情况下这个逗号才是分隔符。如果逗号前的反斜杠数量是奇数,则它是转义逗号,不应发生拆分。

谁能帮我用适合这种情况的正则表达式?

编辑
我知道这个正则表达式:(?<!\\\\),将有助于用前面没有反斜杠的逗号拆分字符串。但就我而言,我还需要拆分以防逗号之前的斜线数量为偶数。

感谢任何帮助。

最佳答案

如果必须拆分,那么您可以尝试类似的方法

split("(?<!(?<!\\\\)\\\\(\\\\{2}){0,1000000000}),")

我使用 {0,1000000000} 而不是 * 因为 Java 中的后视需要有明显的最大长度,而 1000000000 似乎足够好,除非您的文本中可以有超过 1000000000 连续 \\


如果不需要split那么你可以使用

Matcher m = Pattern.compile("(\\G.*?(?<!\\\\)(\\\\{2})*)(,|(?<!\\G)$)",
Pattern.DOTALL).matcher(testString);
while (m.find()) {
System.out.println(m.group(1));
}

\\G 表示上一个匹配的结束,或者如果这是 Matcher 的第一次迭代并且没有字符串 ^ 的上一个匹配开始。


但最快且不太难实现的是编写您自己的解析器,它会使用像 escaped 这样的标志来表示当前检查的字符已使用 \ 转义。

public static List<String> parse(String text) {
List<String> tokens = new ArrayList<>();
boolean escaped = false;
StringBuilder sb = new StringBuilder();

for (char ch : text.toCharArray()) {
if (ch == ',' && !escaped) {
tokens.add(sb.toString());
sb.delete(0, sb.length());
} else {
if (ch == '\\')
escaped = !escaped;
else
escaped = false;
sb.append(ch);
}
}

if (sb.length() > 0) {
tokens.add(sb.toString());
sb.delete(0, sb.length());
}

return tokens;
}

所有方法的演示:

String testString = "a\\,b\\\\,c,d\\\\\\,e,f\\\\g";
String[] splitedString = testString
.split("(?<!(?<!\\\\)\\\\(\\\\{2}){0,1000000000}),");
for (String string : splitedString) {
System.out.println(string);
}

System.out.println("-----");
Matcher m = Pattern.compile("(\\G.*?(?<!\\\\)(\\\\{2})*)(,|(?<!\\G)$)",
Pattern.DOTALL).matcher(testString);
while (m.find()) {
System.out.println(m.group(1));
}

System.out.println("-----");
for (String s : parse(testString))
System.out.println(s);

输出:

a\,b\\
c
d\\\,e
f\\g
-----
a\,b\\
c
d\\\,e
f\\g
-----
a\,b\\
c
d\\\,e
f\\g

关于用于处理转义分隔符和转义转义字符的 Java String.split() 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541519/

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