如何在Java中使用正则表达式匹配字符串结尾?

15

我希望有一个正则表达式模式,可以匹配字符串的结尾。

我正在实现一个词干提取算法,将移除单词的后缀。

例如对于单词“Developers”,应该匹配字符“s”。
以下代码可以实现:

Pattern  p = Pattern.compile("s");
Matcher m = p.matcher("Developers");
m.replaceAll(" "); // it will replace all 's' with ' '

我希望得到一个正则表达式,它只匹配字符串的结尾,类似于replaceLast()函数。

4个回答

21

如果您需要匹配“s”,但仅当它是单词的最后一个字符时,可以使用边界断言$:来实现。


input.replaceAll("s$", " ");

如果您增强正则表达式,就可以通过一次调用 replaceAll 将多个后缀替换为一个后缀:

input.replaceAll("(ed|s)$", " ");

4
使用 $:
Pattern p = Pattern.compile("s$");

1

1
在匹配字符串结尾的字符时,请注意$锚点匹配字符串的结尾或者最后一行换行符之前的位置(如果存在),即使没有使用Pattern.MULTILINE选项也是如此。因此,在Java正则表达式中,使用\z作为字符串的结尾锚点更加安全。 例如:
Pattern p = Pattern.compile("s\\z");

将会在字符串结尾处匹配s

参见相关的正则表达式中\z和\Z有什么区别?何时以及如何使用?帖子。

注意:不要在零长度模式后使用\z$,因为在这种情况下String.replaceAll(regex)将进行两次相同的替换。也就是说,不要使用input.replaceAll("s*\\z", " ");,因为你最终会得到两个空格,而不是一个。可以使用"s\\z"替换一个s,或者使用"s+\\z"替换一个或多个。

如果你仍然想使用replaceAll与以字符串结尾处为锚点的零长度模式来替换单个出现的替换,你可以使用类似于如何为这个看起来很简单的情况制作一个正则表达式?帖子中的解决方法(编写一个“与String replaceAll()一起使用的正则表达式,以从行末尾删除零个或多个空格,并将它们替换为一个句号(.)”的正则表达式)。


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