Java Regex - 删除换行符之外的非字母数字字符

时间:2017-05-17 07:08:31

标签: java regex

我试图从Java中的String中删除所有非字母数字字符但保留回车符。我有以下正则表达式,但它会在换行符之前和之后继续加入单词。

[^\\p{Alnum}\\s]

我如何能够保留换行符或将其转换为空格以便我不会加入单词?

此问题的一个示例如下所示:

原始文字

and refreshingly direct
when compared with the hand-waving of Swinburne.

替换后:

 and refreshingly directwhen compared with the hand-waving of Swinburne.

4 个答案:

答案 0 :(得分:3)

您可以将这些字符添加到正则表达式,而不是\s,因为\s匹配任何空格:

String reg = "[^\\p{Alnum}\n\r]";

或者,您可以使用character class subtraction

String reg = "[\\P{Alnum}&&[^\n\r]]";

此处,\P{Alnum}匹配任何非字母数字,而&&[^\n\r]会阻止LF和CR匹配。

A Java test

String s = "&&& Text\r\nNew line".replaceAll("[^\\p{Alnum}\n\r]+", "");
System.out.println(s); 
// => Text
Newline

请注意,换行符比LF和CR多。在Java 8中,\R构造匹配任何样式换行符和it matches \u000D\u000A|\[\u000A\u000B\u000C\u000D\u0085\u2028\u2029\]

因此,要排除匹配任何换行符,您可以使用

String reg = "[^\\p{Alnum}\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029]+";

答案 1 :(得分:0)

您可以使用此正则表达式[^A-Za-z0-9\\n\\r],例如:

String result = str.replaceAll("[^a-zA-Z0-9\\n\\r]", "");

示例

输入

aaze03.aze1654aze987  */-a*azeaze\n hello *-*/zeaze+64\nqsdoi

<强>输出

aaze03aze1654aze987aazeaze
hellozeaze64
qsdoi

答案 2 :(得分:0)

我的代码犯了一个错误。我正在逐行读取文件并构建String,但没有在每行的末尾添加空格。因此,没有实际的换行符可供替换。

答案 3 :(得分:0)

这是番石榴CharMatcher的完美案例:

String input = "and refreshingly direct\n\rwhen compared with the hand-waving of Swinburne.";
String output = CharMatcher.javaLetterOrDigit().or(CharMatcher.whitespace()).retainFrom(input);

输出将是:

and refreshingly direct
when compared with the handwaving of Swinburne