gpt4 book ai didi

java - 拆分返回 PatternSyntaxException : Illegal/unsupported escape sequence

转载 作者:行者123 更新时间:2023-12-02 09:39:38 25 4
gpt4 key购买 nike

当用户输入包含 Unicode 字符(例如 ' )时,以下操作将失败:

String[] unicodeStrings = answerText.split("((?<=\\R)|(?=\\R))");

我尝试过调试 split 方法,但没有找到根本原因。我有预感这与表达式中的问号(?)有关。

我还尝试了在线 java 正则表达式工具,并将表达式应用于具有以下字符 ‘” 的某些文本。没有显示任何错误。

我还尝试在在线java编译器中编写一个简单的测试方法,其中我传递了带有‘”字符的测试字符串并执行了上述拆分。也没有错误。

代码:

String answerText = uiq.getAnswerText();
if (answerText.matches("[\\x00-\\x7F]*")) //if the answerString consists only of ascii characters we encode it
sb.append("<String name=\"answerText\">")
.append(wrapCdata(uiq.isDate() ? formatDate(uiq.getAnswerText(), sourceFormat, targetFormat) : answerText)).append("</String>");
else { //if the answerString consists of unicode characters we encode only the Linebreakers (the \R)
String answerNonEscapedText = "";
String[] unicodeStrings = answerText.split("((?<=\\R)|(?=\\R))");//This regex splits the string to its linebreak-delimiters, including them. i.e. ("$$$\r\n" ---> [$,$,$,\r\n])
for (String str : unicodeStrings) {
if (str.matches("\\R"))
str = StringEscapeUtils.escapeJava(str);

answerNonEscapedText += str;
}

错误:

java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 6 
((?<=\R)|(?=\R))
^
at java.util.regex.Pattern.error(Pattern.java:1924)
at java.util.regex.Pattern.escape(Pattern.java:2416)
at java.util.regex.Pattern.atom(Pattern.java:2164)
at java.util.regex.Pattern.sequence(Pattern.java:2046)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.group0(Pattern.java:2807)
at java.util.regex.Pattern.sequence(Pattern.java:2018)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.group0(Pattern.java:2854)
at java.util.regex.Pattern.sequence(Pattern.java:2018)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.compile(Pattern.java:1665)
at java.util.regex.Pattern.<init>(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at java.lang.String.split(String.java:2313)
at java.lang.String.split(String.java:2355)

您能帮我找出失败的根本原因吗?

最佳答案

        String answerText = uiq.getAnswerText();
if (answerText.matches("[\\x00-\\x7F]*")) {
sb.append("<String name=\"answerText\">")
.append(wrapCdata(uiq.isDate()
? formatDate(uiq.getAnswerText(), sourceFormat, targetFormat)
: answerText))
.append("</String>");
} else {
String[] unicodeStrings = answerText.split("\\R"); // Splits on linebreaks.
// This looses the exact line delimiter.
String answerNonEscapedText = ""; // Better StringBuilder too.
for (String str : unicodeStrings) {
answerNonEscapedText += str + "\\r\\n";
}

对于某些情况,上述原始行分隔符的丢失很重要:存在 CSV,其中字段值可能包含行分隔符 \n 而行以 \r\n。或者这样。

更简单的解决方案:

        // Java >= 9
String answerText = Pattern.compile("\\R").matcher(uiq.getAnswerText())
.replaceAll(mr -> StringEscapeUtils.escapeJava(mr.group()));


// Java < 9 (only for \r and \n)
String answerText = uiq.getAnswerText()
.replace("\r", "\\r").replace("\n", "\\n");

关于java - 拆分返回 PatternSyntaxException : Illegal/unsupported escape sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57203130/

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