从Java中的字符串中删除所有非“单词字符”,留下重音字符?

2022-08-31 14:29:11

显然,当我使用正则表达式时,Java的正则表达式风格将元音变音和其他特殊字符视为非“单词字符”。

        "TESTÜTEST".replaceAll( "\\W", "" )

为我返回“TESTTEST”。我想要的是只删除所有真正的非“单词字符”。任何方法都可以做到这一点,而无需沿着以下路线

         "[^A-Za-z0-9äöüÄÖÜßéèáàúùóò]"

才意识到我忘了ô?


答案 1

使用 - 这匹配所有既不是字母也不是(十进制)数字的(Unicode)字符。[^\p{L}\p{Nd}]+

在爪哇:

String resultString = subjectString.replaceAll("[^\\p{L}\\p{Nd}]+", "");

编辑:

我改了,因为前者也匹配一些数字符号,如;后者则不然。在 regex101.com 上看到它。\p{N}\p{Nd}¼


答案 2

当我碰到这个线程时,我试图实现完全相反的目标。我知道它已经很老了,但这是我的解决方案。您可以使用块,请参阅此处。在这种情况下,编译以下代码(使用正确的导入):

> String s = "äêìóblah"; 
> Pattern p = Pattern.compile("[\\p{InLatin-1Supplement}]+"); // this regex uses a block
> Matcher m = p.matcher(s);
> System.out.println(m.find());
> System.out.println(s.replaceAll(p.pattern(), "#"));

您应看到以下输出:

#blah

最好