gpt4 book ai didi

regex - 搜索模式中的 Vim/sed 正则表达式反向引用

转载 作者:行者123 更新时间:2023-12-01 11:23:53 29 4
gpt4 key购买 nike

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 , 34 . 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似乎<\([^ >]\+\)变得不贪婪,它试图在第三行强制匹配。有人可以解释为什么它匹配 3rd行:

<aza> Some text </az>

这也是一个regex101 demo

注意这与正则表达式本身无关(可能还有其他方法),而是与该正则表达式的行为有关。

最佳答案

要了解您的正则表达式为何如此运行,您需要了解回溯正则表达式引擎的作用。

引擎会贪婪地匹配并消耗尽可能多的字符。但是,如果它没有找到匹配项,它会返回并尝试找到仍然满足该模式的不同匹配项。

%s,<\([^ >]\+\).*<\/\1>,,gn

对于三号线 <aza> Some text </az> ,

正则表达式引擎查看 \1 = aza .看看是否.*</aza>匹配字符串的其余部分。它没有,所以它为 \1 选择了其他东西.下次它选择 \1 = az看看是否.*</az>匹配字符串的其余部分,它确实如此。所以字符串匹配

(这是一个简化版本。我跳过了 .* 本身可能会做很多回溯的事实)


解决它就像在正则表达式中添加一个 anchor 一样简单,阻止正则表达式搜索可以满足 \1 的其他值。 .在这种情况下匹配空格或 >就足够了。

关于regex - 搜索模式中的 Vim/sed 正则表达式反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39380964/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com