Java删除字符串开头和结尾的所有非字母数字字符

6
我知道如何替换字符串中的所有非字母数字字符,但如何仅在字符串开头和结尾处进行替换呢?
我需要将这个字符串:
"theString,"
变为:
theString
替换字符串中的所有非字母数字字符:
s = s.replaceAll("[^a-zA-Z0-9\\s]", "");

2
从开头和结尾分别有多少? - Elliott Frisch
发布一个例子: - Rod_Algonquin
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html#trimFrom(java.lang.CharSequence) - Matt Ball
5个回答

15

使用 ^(匹配字符串开头)和 $(匹配结束位置)锚点:

s = s.replaceAll("^[^a-zA-Z0-9\\s]+|[^a-zA-Z0-9\\s]+$", "");

“\s” 在这里是干嘛的?我知道 OP 当时写的有,但那是错的,现在也是错的。 - David Conrad
1
没错,这就是为什么它是错误的。OP说“替换字符串中的所有非字母数字字符”。这是一个否定集,因此它将替换除a-z、A-Z、0-9和任何空格字符之外的任何内容。因此它会保留空格。 - David Conrad
@falsetru 这个函数是从字符串的开头和结尾删除所有非字母数字字符,还是只删除开头和结尾的一个字符? - Mike6679
@Mike,它从字符串的开头和结尾删除所有非字母数字字符和非空格字符(我使用了+)。如果您只想删除一个,请删除+ - falsetru
只是一点提示:虽然这个方法确实可行,但由于正则表达式在数千次迭代中的开销太大,所以我不得不使用自己的解析器进行替换。 - Mike6679
显示剩余2条评论

1

使用:

s.replaceAll("^[^\\p{L}^\\p{N}\\s%]+|[^\\p{L}^\\p{N}\\s%]+$", "")

不要使用:

s.replaceAll("^[^a-zA-Z0-9\\s]+|[^a-zA-Z0-9\\s]+$", "")

其中p{L}代表来自任何语言的任何字母。
p{N}代表任何脚本中的任何数字字符。
对于需要使用非英语语言(例如西班牙语)的基于拉丁文的脚本,例如:éstas,apuntó;在后者中将变为:stas和apunt。前者也适用于非拉丁文的语言。
对于所有印欧语言,添加p{Mn}以表示阿拉伯语和希伯来语的元音。

s.replaceAll("^[^\\p{L}^\\p{N}^\\p{Mn}\\s%]+|[^\\p{L}^\\p{N}^\\p{Mn}\\s%]+$", "")

对于德拉维达语言,元音可能会包围辅音 - 与闪族语言不同,其中它们是“在”字符内的 - 如 ಾ。为此,请使用 p{Me}。对于所有语言,请使用:

s.replaceAll("^[^\\p{L}^\\p{N}^\\p{M}\\s%]+|[^\\p{L}^\\p{N}^\\p{M}\\s%]+$", "")

查看正则表达式教程,了解Unicode类别列表


-1
yourString=yourString.replaceAll("^\\W+|\\W+$","");

-1

这会移除所有非字母数字字符

s = s.replaceAll("[^a-zA-Z0-9]", "");

1
这将删除所有非字母数字字符。 - O. Jones
2
仅提供代码的答案被认为是低质量的:请确保提供解释您的代码是如何解决问题的。如果您在帖子中添加更多信息,将有助于提问者和未来的读者。请参阅说明基于代码的答案:https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers - borchvm

-1

Guava的CharMatcher提供了一个简洁的解决方案:

CharMatcher.javaLetterOrDigit().negate().trimFrom(input);

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