1.Qulifiers
Greedy quantifiers X? X* X+ X{n} X{n,} X{n,m}
Reluctant quantifiers X?? 后多跟一个问号
Possessive quantifiers X?+ 后多跟一个加号
public class Test {
public static void main(String args[]) {
Pattern p = Pattern.compile(".{3,10}[0-9]");
String s = "aaaa5b65bbb6a1";
Matcher m = p.matcher(s);
if (m.find()) {
p(m.start() + "-" + m.end());
} else {
p("not match!");
}
}
}
结果是:0-10 此种方式是先吞入最多的字符既是10个字符,发现后面没有跟数字,然后释放以为,检测符合正则表达式
在{3,10}后加问号,结果是:0-5,此种方法是先读入最少的3个字符,检测不符合在吞入一个字符,符号所以结果是0-5
在{3,10}后加+,结果是not match,这种方式是直接吞入10个字符并且不吐出,所以不匹配
2.non-capturing
不捕获字符串
(?X) (?:X) (?idmsuxU-idmsuxU) (?idmsux-idmsux:X) (?=X) (?!X) (?<=X) (?X)
public class Test {
public static void main(String args[]) {
Pattern p = Pattern.compile(".{3}(?=a)");
String s = "444a66b";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group());
}
}
}
结果:444,.{3}(?=a)表示,有3个字符以a结尾,打印该3个字符,不包括a,(?=a).{3}时,结果为a66(放前面包括)
.{3}(?!a),结果是44a 66b (?!a).{3}结果是444 66b
.{3}(?<!a),结果是444 a66(从后往前数不是a的) .{3}(?<=a),结果是44a,反向等同于(?=a).{3}
3.back refenrences向前引用
public class Test {
public static void main(String args[]) {
Pattern p = Pattern.compile("(\\d(\\d))\\2");
String s = "122";
Matcher m = p.matcher(s);
p(m.matches());
}
}
结果:true
表示第3个数是不是和第二组的数匹配,(\\d\\d)\\1,1212结果是true,\\1表示第一个组组过之后的字符串和第一组比较
4.flags的简写
public class Test {
public static void main(String args[]) {
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
p("Java".matches("(?i)(java)"));
}
}
结果:true
(?!)=Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
(?i)表示开启忽略大小写,而(?-i)表示关闭忽略大小写