2

很久以前,我编写了一个名为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+ 个空格,有效地处理连续的空格。

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

4

2 回答 2

6

仅使用\\s将占所有这些。并在整个字符类上添加+量词,以匹配 1 个或多个重复:

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

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

于 2013-08-27T18:17:09.743 回答
-1

我认为这应该有效。

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

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

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

Pattern.compile("[~#@*+%\n\t\r]|\\s{2,}")
于 2013-08-28T09:32:11.763 回答