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

java正则反向引用
“(a|b)\1”在匹配“abaa”时,匹配成功,匹配到的结果是“aa”。

最近在看正则这块,感觉好神奇。

不理解啊,前辈们帮帮忙
------解决方案--------------------
对于正则表达式“([ab])\1”,捕获组中的子表达式“[ab]”虽然可以匹配“a”或者“b”,但是捕获组一旦匹配成功,反向引用的内容也就确定了。如果捕获组匹配到“a”,那么反向引用也就只能匹配“a”,同理,如果捕获组匹配到的是“b”,那么反向引用也就只能匹配“b”。由于后面反向引用“\1”的限制,要求必须是两个相同的字符,在这里也就是“aa”或者“bb”才能匹配成功。
------解决方案--------------------
原理你知道么?


捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值。一个捕获组(Expression)在匹配成功之前,它的内容可以是不确定的,一旦匹配成功,它的内容就确定了,反向引用的内容也就是确定的了。

反向引用必然要与捕获组一同使用的,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理。
------解决方案--------------------
(a
------解决方案--------------------
b)首先从第一个位置开始匹配,匹配第一个字符a,匹配成功,结果为a,然后\1从第2个位置开始匹配,匹配字符b,由于\1代表第一个捕获组匹配到的内容,也就是a,此时他匹配字符b,所以匹配失败。此事进行回溯,(a
------解决方案--------------------
b)从第二个位置开始匹配,匹配字符b,匹配成功,然后\1从下一个位置开始匹配,匹配字符a,此时\1代表第一个捕获组匹配到的内容,也就是b,他要匹配a,所以匹配失败。。继续回溯,一次类推,最终匹配结果aa