gpt4 book ai didi

java - 未转义的 java 在正则表达式 matcher.find() 中不匹配

转载 作者:行者123 更新时间:2023-12-01 23:05:36 25 4
gpt4 key购买 nike

我有以下代码,基本上与“Match this:”匹配并保留第一句话。但是,有时会将 unicode 字符传递到文本中,从而导致其他更复杂的正则表达式发生回溯。转义似乎可以缓解回溯索引超出范围的异常。但是,现在正则表达式不匹配。

我想知道的是为什么这个正则表达式在转义时不匹配?如果你注释掉 escape/unescape java 行的所有内容。

    String text = "Keep this\n\n"
+ "Match this:\n\nDelete 📱 this";
text = org.apache.commons.lang.StringEscapeUtils.escapeJava(text);
Pattern PATTERN = Pattern.compile("^Match this:$",
Pattern.MULTILINE);
Matcher m = PATTERN.matcher(text);
if (m.find()) {
text = text.substring(0, m.start()).replaceAll("[\\n]+$", "");
}
text = org.apache.commons.lang.StringEscapeUtils.unescapeJava(text);
System.out.println(text);

最佳答案

What i would like to know is why this regex isn't matching when escaped?

当你转义像 "foo\nbar" 这样的字符串时打印内容类似于

foo
bar

你得到"foo\\nbar"打印出来的样子

foo\nbar

发生这种情况是因为 StringEscapeUtils.escapeJava也逃脱了\n并将其替换为 \\n ,所以它不再是行分隔符而是简单的文字,所以它不能与 ^ 匹配或$ .

可能的解决方案可以替换回 "\\n""\n"之后StringEscapeUtils.escapeJava 。你在这里需要小心,不要真正“逃亡”"\\n"替换后会给你 "\\\\n"打印出来的样子像 \\n 。所以也许使用

text = org.apache.commons.lang3.StringEscapeUtils.escapeJava(text);
text = text.replaceAll("(?<!\\\\)\\\\n", "\n");// escape `\n`
// if it is not preceded with `\`
//do your job

//and now you can unescape your text (\n will stay \n)
text = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(text);
<小时/>

另一个选择是创建您自己的实现,类似于 StringEscapeUtils.escapeJava 。如果你看一下这个方法体,你会看到

return ESCAPE_JAVA.translate(input);

哪里ESCAPE_JAVA

CharSequenceTranslator ESCAPE_JAVA = 
new LookupTranslator(
new String[][] {
{"\"", "\\\""},
{"\\", "\\\\"},
}).with(
new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE())
).with(
UnicodeEscaper.outsideOf(32, 0x7f)
);

EntityArrays.JAVA_CTRL_CHARS_ESCAPE()返回

的克隆
String[][] JAVA_CTRL_CHARS_ESCAPE = {
{"\b", "\\b"},
{"\n", "\\n"},
{"\t", "\\t"},
{"\f", "\\f"},
{"\r", "\\r"}
};

数组。因此,如果您在这里提供自己的表格,它将明确说明 \n应保持原样(因此应将其替换为自身 \n )您的代码将忽略它。

这就是您自己的实现的样子

private static CharSequenceTranslator translatorIgnoringLineSeparators = 
new LookupTranslator(
new String[][] {
{ "\"", "\\\"" },
{ "\\", "\\\\" },
}).with(
new LookupTranslator(new String[][] {
{ "\b", "\\b" },
{ "\n", "\n" },//this will handle `\n` and will not change it
{ "\r", "\r" },//this will handle `\r` and will not change it
{ "\t", "\\t" },
{ "\f", "\\f" },
})).with(UnicodeEscaper.outsideOf(32, 0x7f));

public static String myJavaEscaper(CharSequence input) {
return translatorIgnoringLineSeparators.translate(input);
}

此方法将防止转义\r\n

关于java - 未转义的 java 在正则表达式 matcher.find() 中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823634/

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