【发布时间】:2010-09-06 01:02:06
【问题描述】:
我试图找出我在 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'。
更新:好的,我想我已经理解了罗斯的回答,并且看到去锚定给了我想要的结果。解锚也给了我一个我不想要的结果,即:
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' (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)
【问题讨论】: