【问题标题】:Adding whitespace handling to existing Java regex向现有 Java 正则表达式添加空格处理
【发布时间】:2023-03-11 14:33:02
【问题描述】:

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

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

【问题讨论】:

    标签: java regex string removing-whitespace


    【解决方案1】:

    只需使用\\s 即可解决所有问题。并在整个字符类上添加 + 量词,以匹配 1 个或多个重复:

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

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

    【讨论】:

    • 啊! 2秒! (+1)
    • +1 还请注意,抛出异常是因为您需要自己转义反斜杠。
    • 您只是禁止所有空格。按照我的阅读方式,\r、\n` 和\t 总是被禁止的,但是一个简单的空格字符是可以的——它只是两个或多个连续 空格是不允许的。
    • @AlanMoore。我看到 OP 正在执行 [ ]+ 以匹配 1 个或多个空格。所以,也许他只是这个意思,只是他没有正确地表达出来。
    【解决方案2】:

    我认为这应该可行。

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

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

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

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

    【讨论】:

    • 在字符类中,{2,} 不是表示两个或更多的量词,它只是文字字符的列表:{2、@987654326 @,或}
    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2012-03-15
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多