分享

Java 正则表达式 ~ 反向引用 1 (作者:梨多情)

 bleach尸魂界 2014-07-01


正则表达式 “(\\w)\\1” 可以匹配 "aa bbbb abcdefg 111121111" 中的多个字符,
那么“(\\w)\\1\\2”可以匹配什么呢?
下面每段内容分别为不同网友的回答,其中最有用的正解,已注明:

( )表示子表达式
注意:和 [ ] 的区别,[ ]只能匹配单个字符,( )可以匹配多个字符 。
\1表示的是第一个子表达式匹配到的结果,
而不是第一个子表达式匹配到的结果的第一个字符,
这点很重要也很容易搞混了,
也就是代表第一个( ),相应的 \2 就代表第二( ),依次类推。


表达式后边的部分,可以引用前面 "括号内的子匹配,已经匹配到的字符串"。
引用方法是 "\" 加上一个数字。
\1\2:
"\1" 引用第1对括号内匹配到的字符串,
"\2" 引用第2对括号内匹配到的字符串。

反向引用和正向引用是一样的,都是引用前面已经匹配了的值。
所以\1引用的是第一个括号里的内容,即\w匹配的内容。
而由于你没有第二个括号,所以\2什么也不匹配。

【lsl -- 正解啊!】
当使用小括号指定一个子表达式时,即可得到匹配的文本,即分组的内容。
规则从左到右,以分组的左括号为标志,第一个出现的分组组号为1,类类推。
\1是 \w 匹配的内容,即整个字符串“aa bbbb abcdefg 111121111”
由于没有第二个分组,所以\2匹配为空。

其实反向引用在实现上和匿名捕获的实现方式很相似
(其名字其实就是\1 \2,我写的正则表达式的引擎里是这么做的,
其他大的库我没有做研究,不过从原理上猜测是一样的)。
\1\2就是前面出现的()括起来顺序出现的子表达式

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多