首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

java中有关正则表达式的一个小疑点

2013-07-08 
java中有关正则表达式的一个小问题有关back引用:Pattern p Pattern.compile((\\d\\d)\\1)String s

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()是用正则表达式匹配指定表达式的整体,而不是部分

热点排行
Bad Request.