【发布时间】:2017-01-15 19:08:44
【问题描述】:
Vim 帮助说:
\1 Matches the same string that was matched by */\1* *E65* the first sub-expression in \( and \). {not in Vi} Example: "\([a-z]\).\1" matches "ata", "ehe", "tot", etc.
看起来 backreference 可以用于搜索模式。我开始玩它,我注意到我无法解释的行为。这是我的文件:
<paper-input label="Input label"> Some text </paper-input>
<paper-input label="Input label"> Some text </paper-inputa>
<aza> Some text </az>
<az> Some text </az>
<az> Some text </aza>
我想匹配开始和结束标签匹配的行,即:
<paper-input label="Input label"> Some text </paper-input>
<az> Some text </az>
我的测试正则表达式是:
%s,<\([^ >]\+\).*<\/\1>,,gn
但这匹配行:1、3 和 4。 sed 也一样:
$ sed -ne 's,<\([^ >]\+\).*<\/\1>,\0,p' file
<paper-input label="Input label"> Some text </paper-input>
<aza> Some text </az>
<az> Some text </az>
这:<\([^ >]\+\) 应该是贪婪的,当试图匹配它时没有 \1 最后那么所有组都是正确的。但是当我添加\1 时,<\([^ >]\+\) 似乎变得不贪心,它试图在第 3 行中强制匹配。有人可以解释为什么它匹配3rd 行:
<aza> Some text </az>
注意 这与正则表达式本身无关(可能还有其他方法),而是该正则表达式的行为。
【问题讨论】:
-
你应该看看回溯引擎。如果找不到匹配项,则引擎将回溯,直到选择不同的内容。例如
\1在所有回溯之后在第三行等于az。 (因为您从未添加过锚点) -
要添加到@FDinoff 的观点,您可以添加规则以匹配空格或> 作为锚点...
<\([^ >]\+\)[ >].*<\/\1> -
@FDinoff 这很有趣。我不知道。
-
@spasic 是的,我了解回溯的工作原理以及空间锚点和 > 似乎是这里最好的主意。
-
@FDinoff 如果您将此添加为答案,我会标记。
标签: regex vim sed backreference capturing-group