【问题标题】:How to filter string for unwanted characters using regex?如何使用正则表达式过滤不需要的字符的字符串?
【发布时间】:2011-06-24 03:50:52
【问题描述】:

基本上,我想知道是否有一个方便的类或方法来过滤字符串中不需要的字符。该方法的输出应该是“清理过的”字符串。即:

String dirtyString = "This contains spaces which are not allowed"

String result = cleaner.getCleanedString(dirtyString);

预期结果是:

"Thiscontainsspaceswhicharenotallowed"

一个更好的例子:

String reallyDirty = " this*is#a*&very_dirty&String"

String result = cleaner.getCleanedString(dirtyString);

我希望结果是:

"thisisaverydirtyString"

因为,我让清洁工知道 ' '、'*'、'#'、'&' 和 '_' 是脏字符。我可以通过使用白/黑列表字符数组来解决它。但我不想重新发明轮子。

我想知道是否已经存在可以使用正则表达式“清理”字符串的东西。而不是自己写这个。

补充: 如果您认为清理字符串可以做得不同/更好,那么我当然也会全神贯注

另一个补充: - 它不仅适用于空格,还适用于任何类型的字符。

【问题讨论】:

  • 所以真正不需要的字符意味着不是 a-z 或 0-9 的任何字符?我更新了我的答案,但仍然不清楚什么是肮脏的角色,什么是干净的角色。

标签: java regex


【解决方案1】:

根据您的更新编辑:

dirtyString.replaceAll("[^a-zA-Z0-9]","")

【讨论】:

  • @Tim,Stefan 对干净与肮脏角色的定义有点不清楚。最初只是空格。
  • 干净的字母只是 a-z 和 A-Z ,没有特殊字符。看起来 replaceAll 将是我所需要的
  • --已解决,愚蠢的失败--该方法不修改字符串,返回修改后的字符串 temp2 = tempString.replaceAll(",",".");
【解决方案2】:

如果您在项目中使用guava(如果不是,我相信您应该考虑一下),CharMatcher 类可以很好地处理这个问题:

你的第一个例子可能是:

result = CharMatcher.WHITESPACE.removeFrom(dirtyString);

而你的第二个可能是:

result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString);
// or alternatively
result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString);

或者如果您想更灵活地使用空格(制表符等),您可以将它们组合起来,而不是自己编写:

CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&"));
result = illegal.removeFrom(dirtyString);

或者您也可以指定合法字符,具体取决于您的要求:

CharMatcher legal = CharMatcher.JAVA_LETTER; // based on Unicode char class
CharMatcher legal = CharMatcher.ASCII.and(CharMatcher.JAVA_LETTER); // only letters which are also ASCII, as your examples
CharMatcher legal = CharMatcher.inRange('a', 'z'); // lowercase only
CharMatcher legal = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')); // either case

后跟retainFrom(dirtyString),如上。

非常好的、强大的 API。

【讨论】:

  • 链接损坏 :(
【解决方案3】:

使用replaceAll

【讨论】:

    【解决方案4】:

    这样就可以了:

    String dirtyString = "This contains spaces which are not allowed";
    String result = dirtyString.replaceAll("\\s", "");
    

    并通过将所有空格替换为“无”来工作。

    【讨论】:

      【解决方案5】:
      String resultString = subjectString.replaceAll("\\P{L}+", "");
      

      将替换任何非字母字符。

      【讨论】:

      • 对整个 Unicode 字母类别使用正则表达式模式的巧妙回答。
      【解决方案6】:

      我也更喜欢白名单方法。你永远不知道会发生什么。似乎有比字符更多的编码。这样你就可以控制一切了:

      public String convert(String s) {
        s = StringUtils.removePattern(s, "[^A-Za-zäöüÄÖÜß?!$,. 0-9\\-\\+\\*\\?=&%\\$§\"\\!\\^#:;,_²³°\\[\\]\\{\\}<>\\|~]'`'");
        return s.trim();
      }
      

      这包含所有德国元音变音和法语口音......你知道 - 看看你的键盘。我想我都选了它们。 随意省略特殊字符,如 以防止代码注入......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        相关资源
        最近更新 更多