【发布时间】:2015-02-23 16:17:16
【问题描述】:
我想从字符串中删除任何非字母数字字符,某些字符除外。
StringUtils.replacePattern(input, "\\p{Alnum}", "");
我怎样才能排除那些特定的字符,比如.-;?
【问题讨论】:
-
你还需要支持unicode字符吗?
我想从字符串中删除任何非字母数字字符,某些字符除外。
StringUtils.replacePattern(input, "\\p{Alnum}", "");
我怎样才能排除那些特定的字符,比如.-;?
【问题讨论】:
使用非运算符^:
[^a-zA-Z0-9.\-;]+
这意味着“匹配不是这些字符的内容”。所以:
StringUtils.replacePattern(input, "[^a-zA-Z0-9.\\-;]+", "");
不要忘记正确转义需要转义的字符:您需要使用两个反斜杠\\,因为您的正则表达式是 Java 字符串。
【讨论】:
[^a-zA-Z0-9.\\-\\@\\_]+ 等?难道没有更优雅的方式吗?
@和_,或者你可以把\Q和\E放在相关字符周围全部逃脱:"[^a-zA-Z0-9.\\Q-@_\\E]+"
你可以否定你的表达;
\p{Alnum}
通过将其置于否定字符类中:
[^\p{Alnum}]
这将匹配任何非字母数字字符,然后您可以将它们替换为""。如果您想允许其他字符,您可以将它们附加到字符类中,例如:
[^\p{Alnum}\s]
不会匹配空白字符 (\s)。
如果你在哪里替换
[^\p{Alnum}.;-]
"" 也允许使用以下字符:.、; 或 -。
【讨论】:
StringUtils 在底层使用 Java 的标准 Pattern 类。如果您不想导入 Apache 的库并希望它运行得更快(因为它不必在每次使用时都编译正则表达式),您可以这样做:
private static final Pattern NO_ODD_CHARACTERS = Pattern.compile("[^a-zA-Z0-9.\\-;]+");
...
String cleaned = NO_ODD_CHARACTERS.matcher(input).replaceAll("");
【讨论】:
你的意思是 StringUtils.replacePattern(input, "[^a-z\.\-]+", ""); 之类的东西——尽管我不知道 StringUtils 是否使用特殊的 RegEx 语法。
【讨论】: