从字符串中删除除字母以外的所有字符

4
如果我有一个字符串"ja.v_,a",我该如何去除所有非字母字符并输出 "java"? 我已尝试使用str = str.replaceAll("\\W", "" ),但没有成功。

你使用的是什么编程语言? - SedJ601
1
移除/替换 [^a-z]?(即所有非字母 a..z 符号) - Dmitry Bychenko
1
我会使用一个for循环来检查每个字符。如果它是一个字符,我会将其连接到一个字符串中。Character.isAlphabetic()是一个起点。 - SedJ601
你是如何尝试移除它们的?你是使用 str.replaceAll(...) 的结果,还是将其作为语句调用的? - Andy Turner
4个回答

4

你能试试这个吗?

System.out.println("ja.v_,a".replaceAll("[^a-zA-Z]", "")) //java

4
我想引用这篇文章并引用其中的内容:

正则表达式示例和教程总是给出[a-zA-Z0-9]+正则表达式来“验证字母数字输入”。它内置在许多验证框架中。但它是完全错误的。除非你有一个相当好的解释,否则此正则表达式不应该出现在你的代码中。然而,这个例子无处不在。相反,正确的正则表达式是[\p{L}0-9]+

所以在你的情况下,应使用:

str.replaceAll("[^\\p{L}]", "");
System.out.println("ja.v_,a".replaceAll("[^\\p{L}]", ""));
System.out.println("сл-=о-_=во!".replaceAll("[^\\p{L}]", ""));

\p{L} 指Unicode中的“字母”定义。


语句 str.replaceAll("[^\p{L}]", ""); 是无用的。你需要以某种方式使用结果。 - Andy Turner
1
@AndyTurner 那是没错,我的意思是在2017年,“a-z”模式不再是好的开发人员要习惯的最佳解决方案。该理由在我所提到的文章中有说明。 - Mikhail Antonov
1
这是一个重要的答案。我只想补充一下,\p{L} 是 Unicode 中“字母”的定义。 - Dev-iL
1
根据这里中的“Unicode类别”部分,最好使用\P{M}\p{M}*+来匹配一个或多个Unicode字符,因为带有变音符号的字母可能以不同的方式编码:现在您应该明白为什么\P{M}\p{M}*+等同于\X了。 \P{M}匹配不是组合标记的代码点,而\p{M}*+匹配零个或多个组合标记的代码点。要匹配包括任何变音符号的字母,请使用\p{L}\p{M}*+。这个正则表达式将始终匹配à,无论它如何编码。... - WesternGun

1
String test= "ja.v_,a";

int len=test.length();

String alphaString="";

for(int i=0; i<len; i++){
     if (Character.isLetter(test.charAt(i))) {
         alphaString=alphaString+test.charAt(i);
     }
}

System.out.println(alphaString);

0
String s = "ja.v_,a";
s = s.replaceAll("[^a-z]", "");
System.out.println(s);

>java

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