<h(\d)>(.*?)</h\1>中\1的目的是捕获第一个()内的即(\d)中的捕获值,如果有“<h1>这是一号标题</h1>”,那么\1就捕获了数字1,如果有“<h7>这是7号标题</h7>”,那么\1就捕获了数字7。
如果使用<h(\d)>(.*?)\1</h>,则能捕获类似“<h7>这是7号标题:7</h>”,但无法在“<h7>这是7号标题</h7>”中找到捕获值了。
-------------------------------------
重点:正则表达式多重捕获顺序问题
-------------------------------------
(1)根据左括号的从左至右顺序按顺序编号(记住:关键字“左括号”,“从左至右”)
(2)先对所有非命名捕获进行计数后才开始对命名捕获进行编号。(注意“命名捕获在后”原则)
(3)编号为0的第一个捕获总是指整个模式。(也就是整个表达式所匹配的最大项)
以上说明:
(1)整项优先
(2)同级左优先
(3)同级非命名捕获优先
(4)同级的所有子级计完后再进入右边的下一个同级进行捕获。
(5)命名捕获总在最后,也尊从从左至右原则。
如:((?<One>abc)\d+)?(?<Two>xyz)(.*)用来匹配:“abc255xyz这是一个字符串。”
那么\0:即整个表达式匹配项。“abc255xyz这是一个字符串。”
\1:((?<One>abc)\d+) “abc255”
\2:(.*) “这是一个字符串。”
\3:(?<One>abc) “abc”(也可用\One,One是对匹配项的命名)
\4:(?<Two>xyz) “xyz”(也可用\Two)你的第二个问题是由于正则表达式中的“[]”号引起的,在正则表达式中括号表示“或者”,所以应该对中括号进行转义,即前加\,变成\[url\]等。