【问题标题】:How to remove any non-alphanumeric characters?如何删除任何非字母数字字符?
【发布时间】:2015-02-23 16:17:16
【问题描述】:

我想从字符串中删除任何非字母数字字符,某些字符除外。

StringUtils.replacePattern(input, "\\p{Alnum}", "");

我怎样才能排除那些特定的字符,比如.-;

【问题讨论】:

标签: java regex


【解决方案1】:

使用非运算符^:

[^a-zA-Z0-9.\-;]+

这意味着“匹配不是这些字符的内容”。所以:

StringUtils.replacePattern(input, "[^a-zA-Z0-9.\\-;]+", "");

不要忘记正确转义需要转义的字符:您需要使用两个反斜杠\\,因为您的正则表达式是 Java 字符串。

【讨论】:

  • 所以当有多个字符时,我必须转义任何字符,例如:[^a-zA-Z0-9.\\-\\@\\_]+ 等?难道没有更优雅的方式吗?
  • 是的,你可以不逃避不需要逃避的东西,比如@_,或者你可以把\Q\E放在相关字符周围全部逃脱:"[^a-zA-Z0-9.\\Q-@_\\E]+"
【解决方案2】:

你可以否定你的表达;

\p{Alnum}

通过将其置于否定字符类中:

[^\p{Alnum}]

这将匹配任何非字母数字字符,然后您可以将它们替换为""。如果您想允许其他字符,您可以将它们附加到字符类中,例如:

[^\p{Alnum}\s]

不会匹配空白字符 (\s)。

如果你在哪里替换

[^\p{Alnum}.;-]

"" 也允许使用以下字符:.;-

【讨论】:

  • 您的最后一个表达式在另外用 Q..E 包装时效果很好。,
【解决方案3】:

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("");

【讨论】:

    【解决方案4】:

    你的意思是 StringUtils.replacePattern(input, "[^a-z\.\-]+", ""); 之类的东西——尽管我不知道 StringUtils 是否使用特殊的 RegEx 语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 2014-06-15
      • 1970-01-01
      • 2017-03-14
      • 2013-11-29
      • 1970-01-01
      • 2019-06-21
      相关资源
      最近更新 更多