我尝试遵循此处描述的解决方案:https://stackoverflow.com/a/17973873/2149915 尝试匹配具有以下要求的字符串: -字符串中顺序重复的3个以上字符应匹配并返回。
示例:
依此类推,以此类推,目的是检测无意义的文本。
到目前为止,我的解决方案是按原样修改链接中的正则表达式。
原始:^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$
已自适应:^(?!.*([A-Za-z0-9\.\,\/\|\\])\1{3})$
从本质上讲,我删除了捕获数字和字母数字的组的要求:(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+
,并尝试添加额外的字符检测功能,例如./,\
等,但似乎根本不与任何字符匹配...
关于我如何实现这一目标的任何想法?
提前谢谢:)
编辑:
我在这个问题https://stackoverflow.com/a/44659071/2149915上找到了这个正则表达式:^.*(\S)(?: ?\1){9,}.*$
,并对其进行了修改,使其仅可匹配3个字符,例如^.*(\S)(?: ?\1){3}.*$
。
现在它可以检测到以下情况:
但是它不考虑这样的空格:
. . . . .
是否可以进行修改以实现此目的?
答案 0 :(得分:2)
如果您要查找重复超过3次的任何字符,我认为有一个更简单的解决方案:
String[] inputs = {
"hello how are you...", // -> VALID
"hello how are you.............", // -> INVALID
"hiii", // -> VALID
"hiiiiii" // -> INVALID
};
// | group 1 - any character
// | | back-reference
// | | | 4+ quantifier including previous instance
// | | | | dot represents any character,
// | | | | including whitespace and line feeds
// | | | |
Pattern p = Pattern.compile("(.)\\1{3,}", Pattern.DOTALL);
// iterating test inputs
for (String s: inputs) {
// matching
Matcher m = p.matcher(s);
// 4+ repeated character found
if (m.find()) {
System.out.printf(
"Input '%s' not valid, character '%s' repeated more than 3 times%n",
s,
m.group(1)
);
}
}
输出
Input 'hello how are you............. not valid', character '.' repeated more than 3 times
Input 'hiiiiii' not valid, character 'i' repeated more than 3 times
Input 'hello how are you' not valid, character ' ' repeated more than 3 times