将空白处理添加到现有Java正则表达式

时间:2013-08-27 18:15:49

标签: java regex string removing-whitespace

很久以前我写了一个名为detectBadChars(String)的方法,它检查String参数是否存在所谓的“坏”字符的实例。

原始的不良角色列表是:

  • '〜'
  • '#'
  • '@'
  • '*'
  • '+'
  • '%'

我的方法很有效,是:

// Detects for the existence of bad chars in a string and returns the
// bad chars that were found.
protected String detectBadChars(String text) {
    Pattern pattern = Pattern.compile("[~#@*+%]");
    Matcher matcher = pattern.matcher(text);

    StringBuilder violatorsBuilder = new StringBuilder();

    if(matcher.find()) {
        String group = matcher.group();
        if (!violatorsBuilder.toString().contains(group))
            violatorsBuilder.append(group);
    }

    return violatorsBuilder.toString();
}

现在业务逻辑发生了变化,现在 认为是坏的:

  • 回车(\r
  • 换行(\n
  • 标签(\t
  • 任何连续的空格(" "" "等)

所以我试图修改正则表达式来容纳新的坏字符。将正则表达式更改为:

    Pattern pattern = Pattern.compile("[~#@*+%\n\t\r[ ]+]");

...抛出异常。我的想法是,为正则表达式添加“\ n \ t \ r”将分别为换行符,制表符和CR分配。然后添加"[ ]+"添加一个由空格组成的新“类/组”,然后将这些组分组为允许1个以上的空格,有效地处理连续的空格。

我要去哪里,我的正则表达应该是什么(以及为什么)?提前谢谢!

2 个答案:

答案 0 :(得分:6)

只需使用\\s即可占用所有这些内容。并在整个字符类中添加+量词,以匹配1个或多个重复:

Pattern.compile("[~#@*+%\\s]+");

请注意,在Java中,您需要转义反斜杠。所以它是\\s而不是\s

答案 1 :(得分:-1)

我认为这应该有用。

Pattern.compile("[~#@*+%\n\t\r\\s{2,}]");

你需要\\ s {2,}来匹配任何连续的空格。

编辑:我上面犯了一个错误。感谢Alan Moore的指出。这是新的解决方案。

Pattern.compile("[~#@*+%\n\t\r]|\\s{2,}")