Java使用正则表达式从字符串中删除模式。

10

我需要从以下子字符串中清除我的字符串:

\n

\uXXXX(其中X是数字或字符)

例如:"OR\n\nThe Central Site Engineering\u2019s \u201cfrontend\u201d, where developers turn to"

-> "OR The Central Site Engineering frontend , where developers turn to"
我尝试使用String的replaceAll方法,但不知道如何解决\uXXXX问题,而且它对于\n也不起作用

String s = "\\n";  
data=data.replaceAll(s," ");

这个正则表达式在Java中是什么样子?

谢谢帮助。


1
你能描述一下你尝试过什么以及为什么没有成功吗?此外,你的文本似乎不应该从这些字符中剥离,而是应该用它们所代表的字符进行替换,例如\n->行分隔符,\u2019-> \u201c->等。 - Pshemo
也许你正在询问如何取消转义这些字符 - Pshemo
我需要将它们替换为空格。由于它将被Apache Lucene索引,我不需要它们,我只需要显示单词。 - D.Shefer
根据您的示例,您需要将它们替换为空格,而不是删除它们。无论如何,这不是难任务,所以您一定尝试过一些方法。我们能看到您的尝试吗? - Pshemo
处理换行符:string.replaceAll("\n", " "); 我也尝试将 \n 放入字符串中,而不是写在“内联”中。 - D.Shefer
请在您的问题中发布您的尝试。您可以使用[编辑]选项来完成。要添加代码格式,请使用编辑器中的{}按钮。 - Pshemo
2个回答

14

string.replaceAll("\\n", " ");这段代码存在问题,因为replaceAll方法期望使用正则表达式进行匹配,而在正则表达式中\是一个特殊字符,用于创建字符类如\d表示数字,或转义正则表达式的特殊字符如+

因此,如果想要在Java的正则表达式中匹配\,需要对其进行双重转义:

  • 一次是在正则表达式中\\
  • 一次是在字符串中"\\\\"

就像replaceAll("\\\\n", " ")一样。

你也可以让正则表达式引擎为你做转义工作,使用replace方法来替换,例如

replace("\\n", " ")

现在,要删除\uXXXX,可以使用

replaceAll("\\\\u[0-9a-fA-F]{4}", "")


还要记住,字符串是不可变的,所以每次调用str.replace..都不会改变str的值,而是创建一个新的字符串。因此,如果想要将新的字符串存储在str中,需要使用

str = str.replace(..)

那么,你的解决方案可以如下所示

String text = "\"OR\\n\\nThe Central Site Engineering\\u2019s \\u201cfrontend\\u201d, where developers turn to\"";

text = text.replaceAll("(\\\\n)+"," ")
           .replaceAll("\\\\u[0-9A-Ha-h]{4}", "");

非常感谢!需要关于replaceAll参数的解释! - D.Shefer
1
@D.Shefer 没关系。但是我之所以能够给你这样的解释,只是因为你发布了你的代码尝试。如果没有它,我只会发布解决方案,而没有适当的解释,这对你的受益不大,所以在将来,请始终发布你的代码尝试,这样人们就可以看到你正在努力解决什么问题,以便给你最好的答案。 - Pshemo

0
最好分两部分来做,我想:
String ex = "OR\n\nThe Central Site Engineering\u2019s \u201cfrontend\u201d, where developers turn to";
String part1 = ex.replaceAll("\\\\n"," "); // The firs \\ replaces the backslah, \n replaces the n.
String part2 = part1.replaceAll("u\\d\\d\\d\\d","");
System.out.println(part2);

试一下 =)


好的,我表达不够准确。问题中看到的示例似乎不是字符串文字,而是可以从文件中读取的文本。因此,\n不是行分隔符,而是表示两个字符“\”和“n”的字符串。因此,您的解决方案有效,但仅因为您让Java编译器将\n更改为行分隔符,然后可以通过"\n""\\n"进行匹配。 - Pshemo
这个问题的标题意味着需要使用正则表达式。 - Shai Alon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接