1、包含A或者B,且不包含C
(?!.*hi)(?=.*abc|efg.*)
此处A为abc,B为efg ,C为hi
String reg = "(?!.*hi)(?=.*abc|efg.*)";
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE) ;
String test = "11abc2345efg789hi";
Matcher m = pattern.matcher(test) ;
System.out.println(m.find()); // false
test = "11abc2345efg789h1i";
m = pattern.matcher(test) ;
System.out.println(m.find()); // true
2、连续3个字母或数字:"([0-9a-zA-Z]{1,2})\\1{2}"
循环获取:
String reg = "([0-9a-zA-Z]{1,2})\\1{2}";// "([0-9a-zA-Z])\\1{2}";
String test = "ababab1cdcdcd2eee34445";
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE) ;
Matcher m = pattern.matcher(test) ;
while(m.find()){
System.out.println(m.group());
}
结果:
ababab
cdcdcd
eee
444
3、0加上2-3个数字加上"-" 加上8个数字,即区号-电话号码029-12345678或0898-12345678
String reg = "(0[\\d]{2,3}-[\\d]{8})";
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE) ;
String test = "0129-12345678029-87654321";
Matcher m = pattern.matcher(test) ;
int i = 0 ;
while (m.find()){
System.out.println((++i) + "、 -- "+m.group(1)) ;
}
结果:
1、 -- 0129-12345678
2、 -- 029-87654321
4、查找单词hi :\\bhi\\b
\\b代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
5、强密码验证 :^(?=^.{8}$)(?=.*\\d)(?=.*\\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\\n).*$
String reg = "^(?=^.{8}$)(?=.*\\d)(?=.*\\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\\n).*$";
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE) ;
String test = "12345~aB";
Matcher m = pattern.matcher(test) ;
if (m.find()){
System.out.println("matched") ;
}
由五个零宽断言和一个负向零宽断言(负向表否定)组成。前五个分别是:必须是8位以上、必须出现数字、必须出现特殊符号(非字母数字下划数)、必须出现大写字母、必须出现小写字母。最后一个负向零宽断言是:不得出现换行。大家会发现每个断言都是以 .* 开头,那这个表示什么意思呢?因为这些断言都是写在同一位置,而同一位置是不可能同时出现以上六种情况的。所以用 .* 来告诉表达式,这个断言之前可以有字符(意即这个断言可以出现在接下来的字符串任何位置)。
String str = "A7890BAAAACB12345" ; //String reg = "(.*(?!(\\w)\\1{4}).*){17}" ; String reg = "(?!.*(.)\\1{4}.*)([\\dA-HJ-NPR-Z]{12}[\\d]{5})" ;