日期:2014-05-20  浏览次数:20641 次

java中有关正则表达式的一个小问题
有关back引用:

Pattern p =Pattern.compile("(\\d\\d)\\1");
String s = "0101";
Matcher m = p.matcher(s);
System.out.println(m.matches());

打印的是true,但如果改为:s="010101"打印的就是false,这个不太懂,还有:

Pattern p =Pattern.compile("(\\d(\\d))\\2");
String s = “011”;
Matcher m = p.matcher(s);
System.out.println(m.matches());

打印的是true,但如果改为s="0111"打印的就是false,为什么是这种情况呢,难道是1和2决定了只能匹配1次和2次吗?还有是不是1和2决定了只能匹配第1组的和第2组的呢?
希望大家不吝赐教啊。
Java 正则表达式

------解决方案--------------------
\1 \2在正则中是表示反向引用第一组 第二组,以此类推.你第一个正则(\d\d)\1表示捕获两个数字,这两个数字代表组一。\1代表两个数字后跟着是和第一组一样的两个数字(即跟这两个数字一样的两个数字)所以0101匹配010101就不匹配了
而你的第二个正则(\d(\d))\2代表捕获两个数字为组一其中的(\d)是组2也就是你后面用\2代表的是(\d)而不是(\d(\d))所以011是匹配的0111当然是false

------解决方案--------------------
引用:
\1 \2在正则中是表示反向引用第一组 第二组,以此类推.你第一个正则(\d\d)\1表示捕获两个数字,这两个数字代表组一。\1代表两个数字后跟着是和第一组一样的两个数字(即跟这两个数字一样的两个数字)所以0101匹配010101就不匹配了
而你的第二个正则(\d(\d))\2代表捕获两个数字为组一其中的(\d)是组2也就是你后面用\2代表的是(\d)而不是(\d(\d))所以011是匹配的0111当然是false


支持 另外matches()是用正则表达式匹配指定表达式的整体,而不是部分