gpt4 book ai didi

regex - 关于 Vim 中正则表达式的问题

转载 作者:行者123 更新时间:2023-12-04 23:32:01 24 4
gpt4 key购买 nike

我试图找出我在 Vim 中得到的一些正则表达式比较结果背后的原因。我正在尝试匹配以一个或多个星号开头的字符串。以下是各种正则表达式如何匹配字符串:

echo '* text is here' =~ '\^*\*\s'  prints 1 (i.e., MATCH)
echo '* text is here' =~ '^*\*\s' prints 0 (NO MATCH)

echo '** text is here' =~ '\^*\*\s' (MATCH)
echo '** text is here' =~ '^*\*\s' (MATCH)

echo '*** text is here' =~ '\^*\*\s' (MATCH)
echo '*** text is here' =~ '^*\*\s' (NO MATCH)

echo 'text is here' =~ '\^*\*\s' (NO MATCH)
echo 'text is here' =~ '^*\*\s' (NO MATCH)

echo '*text is here' =~ '\^*\*\s' (NO MATCH)
echo '*text is here' =~ '^*\*\s' (NO MATCH)

从这些结果中我得出结论,当行首字符 (^) 前没有反斜杠时,以下 * 被读作文字,反斜杠_* 也被读作文字。因此,使用 no-initial-backslash 方法进行比较时的结果仅匹配具有两个星号后跟一个空格的字符串。

当 ^-字符前面带有反斜杠时,第一个星号是文字星号,反斜杠-* 代表“零个或多个前面的字符”。

带有初始反斜杠的版本给了我想要的答案;即,它匹配以一个或多个星号开头,后跟一个空格的所有唯一行。为什么是这样?当我查看 Vim 文档时,它说\^ 代表文字 ^,而不是一行的开头。我确定有一个简单的解释,但我看不到。感谢您的澄清。

在输入这个问题时,我也注意到一些类似的行为。也就是说,以下字符串在文本中未显示的第二个星号之前有一个反斜杠: '^**\s​​' 。

更新:好的,我想我已经理解了罗斯的回答,并且看到解 anchor 给了我想要的结果。解 anchor 也给了我一个我不想要的结果,即:
echo 'text* is here' =~ '\^*\*\s' (MATCH)

所以我现在的问题是:什么正则表达式将匹配以一个或多个星号开头、后跟一个空格的 all-and-only 行?下面的正则表达式接近但在最后一个例子中失败:
echo '*** text is here' =~ '^**\s' (MATCH)
echo '* text is here' =~ '^**\s' (MATCH)
echo 'text* is here' =~ '^**\s' (NO MATCH)
echo ' * text is here' =~ '^**\s' (MATCH) -- want a no match here

以斜线星号作为第一个星号的版本也不起作用(即 '^\**\s' )。

最终更新:好的,我想我找到了有效的版本。不过,我不明白为什么它会起作用。除了 ^ 字符后面的星号外,它看起来像我所期望的那样,但是在 ^ 后面有一个中继器似乎是荒谬的:
echo '*** text is here' =~ '^*\**\s' (MATCH)
echo '* text is here' =~ '^*\**\s' (MATCH)
echo 'text* is here' =~ '^*\**\s' (NO MATCH)
echo ' * text is here' =~ '^*\**\s' (NO MATCH)

最佳答案

啊,有趣的解释,但不太正确。
\^确实是指字面的抑扬符。

但是*不表示“一个或多个”,它表示“零个或多个”,所以 \^*为了使表达式的其余部分成功,如果需要,则简单地不匹配任何内容,此外,它显然会“去除”其余的搜索,使其更容易成功。

我想,随着这块拼图的填满,你会毫不费力地理解其余的......

更新:我认为最后一块拼图是 vi 对上下文外的正则表达式魔术字符做了一些不同的事情。如果你在一个不可能是魔法的上下文中使用一个,你不会像使用 Perl 或 Ruby 那样得到错误,这个字符只是变得非魔法。和 *不重复 ^ anchor ,所以像 /*/ 这样的搜索或 /^*/将寻找任何实际 *或以实际 * 开头的行, 分别。

关于regex - 关于 Vim 中正则表达式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3648490/

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