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.
看起来在搜索模式中可以使用反向引用。我开始尝试并注意到了无法解释的行为。这是我的文件:
<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
时,似乎<\([^ >]\+\)
变得不贪婪了,它试图强制匹配第三行。有人能解释为什么它匹配第三行
吗?
<aza> Some text </az>
这也是一个regex101演示
注意:这不是关于正则表达式本身的(可能有其他方法可以做到),而是关于该正则表达式的行为。
\1
等于az
。(因为你从未添加锚点) - FDinoff<\([^ >]\+\)[ >].*<\/\1>
- Sundeep