密码必须符合以下4条规则中的3条:
(1)大写字母、
(2)小写字母、
(3)数字、
(4)特殊字符(`~!@#$%^*()+-=|[]{}:;',.>/\?)
关键在任何三条,满足任何一条都没什么问题。
写了半天 还是没有一个能够完全匹配的,哪位大侠能给点提示?不要在无满意结贴了! 在这先谢过了
(1)大写字母、
(2)小写字母、
(3)数字、
(4)特殊字符(`~!@#$%^*()+-=|[]{}:;',.>/\?)
关键在任何三条,满足任何一条都没什么问题。
写了半天 还是没有一个能够完全匹配的,哪位大侠能给点提示?不要在无满意结贴了! 在这先谢过了
Windows98 Windows2000 WindowsXPWindows(?=98),匹配Windows98中的Windows,但不匹配Windows2000,WindowsXP中的Windows
Windows(?!98),刚好相反,匹配Windows2000,WindowsXP中的Windows,但不匹配Windows98中的Windows(?<=Windows)98,匹配Windows98中的98,但不匹配1998的98
(?<!Windows)98,匹配1998中的98,但不匹配Windows98的98
public static void main(String[] args) throws Exception {
System.out.println("============TRUE=============");
System.out.println(test("abc"));
System.out.println(test("ABC"));
System.out.println(test("123"));
System.out.println(test(",,,"));
System.out.println("============FALSE============");
System.out.println(test("aB1"));
System.out.println(test("aBc1"));
System.out.println(test("A1c"));
System.out.println(test("xY,abc"));
System.out.println(test("AAAAbbbbCCCC1111,,,,"));
System.out.println(test("aAbB1,1Cc"));
System.out.println("========以下判断错误==========");
System.out.println(test("aAa"));
System.out.println(test("aBc"));
System.out.println(test("1,1"));
} static boolean test(String str) {
String regex = "(?:.*(?:\\p{Punct}+(?!\\p{Punct})|[A-Z]+(?![A-Z])|[a-z]+(?![a-z])|\\d+(?!\\d))){3,}";
return str.matches(regex);
}
4种不同的
一般我直接google
或者去找个在线帮助的那种
能不能给小弟我讲讲,正则里面:特殊构造(非捕获)
(?:X) X,作为非捕获组 X不被匹配
(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off 不明白
(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组 不明白
(?=X) X,通过零宽度的正 lookahead x不被匹配那和1有什么区别?
(?!X) X,通过零宽度的负 lookahead 零宽度?是没有间隔?
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
(?>X) X,作为独立的非捕获组 ?这个有啥用以上内容的白话讲法?
书回去翻过了,不过暂时还没找到比较好的解决方法。1. 捕获
括号的作用,除了配对外,更重要的就是capture捕获。see Matcher.group
捕获的含义
比如我要
替换A1A,A2A,B3B为AA1,AA2,BB3
String[] array = new String[] {
"A1A", "A2A", "B3B"
};
for (String string : array) {
System.out.println(string.replaceAll("([A-Z])(\\d)\\1", "$1$1$2"));
}([A-Z])匹配第一个字母,且将其捕获为第一个捕获组 group(1),
(\d),匹配第二个的数字,且捕获为第二组
\1,反向引用,内容是动态的,具体内容就是最近一次匹配时,第一组的内容replaceAll后面那个参数,也是反向引用。如果只是想用括号表达优先度,不想作为捕获组的话,那么就用(?:XXXXXX)==============================================(?is..)开关,
lz应该知道Pattern.compile(regex,这里有个开关选项),这个开关是全局的,而(?is..)开关是局部
下面以大小写开关i , Pattern.CASE_INSENSITIVE为例 // 全局不区分大小写
Pattern pattern1 = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);
Matcher matcher1 = pattern1.matcher("AB--ab--Ab--aB");
while (matcher1.find()) {
System.out.println(matcher1.group()); // BTW,整个匹配就是第0组捕获
}
System.out.println("=====================");
// 仅在开关之间不区分大小写
Pattern pattern2 = Pattern.compile("(?i)a(?-i)b");
Matcher matcher2 = pattern2.matcher("AB--ab--Ab--aB");
while (matcher2.find()) {
System.out.println(matcher2.group()); // BTW,整个匹配就是第0组捕获
}
System.out.println("=====================");
// 仅在括号内不区分大小写,而且这个括号不是捕获组
Pattern pattern3 = Pattern.compile("(?i:a)b");
Matcher matcher3 = pattern3.matcher("AB--ab--Ab--aB");
while (matcher3.find()) {
System.out.println(matcher3.group()); // BTW,整个匹配就是第0组捕获
}
环视lookahead、lookbehind,会在匹配段前后座测试 String test = "Windows家族包括了Windows95、Windows98、Windows2000、WindowsXP";
String[] regex = new String[] {
"(Windows)(\\d+)", // group(1) = Windows, group(2) = 数字, group(0) = Windows数字
"(?:Windows)(\\d+)", // group(1) = 数字, group(0) = Windows数字
"Windows(?=\\d+)", // 不会匹配Windows家族和WindowsXP,但group(0) = Windows,后面没有数字
};
for (String r : regex) {
Pattern pattern = Pattern.compile(r);
Matcher matcher = pattern.matcher(test);
System.out.println("=====" + r + "=====");
while (matcher.find()) {
System.out.printf("group(0)=%s%n", matcher.group());
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.printf("group(%d)=%s%n", i, matcher.group(i));
}
System.out.println("-----------");
}
}=====(Windows)(\d+)=====
group(0)=Windows95
group(1)=Windows
group(2)=95
-----------
group(0)=Windows98
group(1)=Windows
group(2)=98
-----------
group(0)=Windows2000
group(1)=Windows
group(2)=2000
-----------
=====(?:Windows)(\d+)=====
group(0)=Windows95
group(1)=95
-----------
group(0)=Windows98
group(1)=98
-----------
group(0)=Windows2000
group(1)=2000
-----------
=====Windows(?=\d+)=====
group(0)=Windows
-----------
group(0)=Windows
-----------
group(0)=Windows
-----------