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

显然,Java的正则expression式把Umlauts和其他特殊字符作为非“字符字符”,当我使用正则expression式。

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

为我返回“TESTTEST”。 我想要的是只有所有真正的非“字字符”被删除。 任何方式做到这一点,没有沿线的东西

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

只有意识到我忘了?

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

在Java中:

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

编辑:

我将\p{N}更改为\p{Nd}因为前者也匹配一些数字符号,例如¼ ; 后者不。 在regex101.com上查看 。

当我碰到这个线程时,我试图达到完全相反的效果。 我知道这是相当古老,但这是我的解决scheme。 你可以使用块,看到这里 。 在这种情况下,编译以下代码(使用正确的导入):

 > 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

最好,

有时你不想简单地删除字符,但只是删除口音。 当我需要在URL中包含一个string时,我想到了在Java REST Web项目中使用的以下实用程序类:

 import java.text.Normalizer; import java.text.Normalizer.Form; import org.apache.commons.lang.StringUtils; /** * Utility class for String manipulation. * * @author Stefan Haberl */ public abstract class TextUtils { private static String[] searchList = { "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß" }; private static String[] replaceList = { "Ae", "ae", "Oe", "oe", "Ue", "ue", "sz" }; /** * Normalizes a String by removing all accents to original 127 US-ASCII * characters. This method handles German umlauts and "sharp-s" correctly * * @param s * The String to normalize * @return The normalized String */ public static String normalize(String s) { if (s == null) return null; String n = null; n = StringUtils.replaceEachRepeatedly(s, searchList, replaceList); n = Normalizer.normalize(n, Form.NFD).replaceAll("[^\\p{ASCII}]", ""); return n; } /** * Returns a clean representation of a String which might be used safely * within an URL. Slugs are a more human friendly form of URL encoding a * String. * <p> * The method first normalizes a String, then converts it to lowercase and * removes ASCII characters, which might be problematic in URLs: * <ul> * <li>all whitespaces * <li>dots ('.') * <li>(semi-)colons (';' and ':') * <li>equals ('=') * <li>ampersands ('&') * <li>slashes ('/') * <li>angle brackets ('<' and '>') * </ul> * * @param s * The String to slugify * @return The slugified String * @see #normalize(String) */ public static String slugify(String s) { if (s == null) return null; String n = normalize(s); n = StringUtils.lowerCase(n); n = n.replaceAll("[\\s.:;&=<>/]", ""); return n; } } 

作为一名德语演讲者,我已经包括了对德语变音符号的适当处理 – 列表应该容易扩展到其他语言。

HTH

编辑:请注意,在URL中包含返回的string可能是不安全的。 您至less应该对其进行HTML编码以防止XSS攻击。

那么,这是我结束了一个解决scheme,但我希望有一个更优雅的… …

 StringBuilder result = new StringBuilder(); for(int i=0; i<name.length(); i++) { char tmpChar = name.charAt( i ); if (Character.isLetterOrDigit( tmpChar) || tmpChar == '_' ) { result.append( tmpChar ); } } 

result以期望的结果结束…

您可能需要首先删除重音符号和变音符号 ,然后在每个字符位置检查“简化”string是否是ASCII字母 – 如果是,则原始位置应包含单词字符,否则可将其删除。

你可以使用apache的StringUtils