我试图从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.
答案 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