很久以前我写了一个名为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个以上的空格,有效地处理连续的空格。
我要去哪里,我的正则表达应该是什么(以及为什么)?提前谢谢!
答案 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,}")