【问题标题】:vim regex multiline: search works, match() doesn'tvim 正则表达式多行:搜索有效,match() 无效
【发布时间】:2015-12-26 22:47:00
【问题描述】:

假设我有这个缓冲区:

a
b
c
(
1
2
3
)
@
#
$

我想在 vimscript 中获取括号之间的行的内容。

/(\n\(.\n\)*)

突出显示我想要的。但我无法通过以下方式获得此结果:

let pattern = '(\n\(.\n\)*)'
match(getline(1, '$'), pattern)

我尝试了很多东西,例如:

match(join(getline(1,'$'), '\n'), pattern)  

,甚至是模式的双引号,但没有任何效果......有什么想法吗?

(我的目标不是使 match() 有效,而只是将结果从缓冲区获取到 vimscript)

【问题讨论】:

  • 或许,let pattern = '(\n\(.\n\)*)'?
  • 你说得对,已编辑。
  • 在我看来您正在寻找(\n\(.\{-}\))
  • 仅供参考,有多行正则表达式原子。所以你可能想要'(\(\_.\{-}\))
  • 我尝试了 'help /\_',但我认为 '\_' 在列出的字符之前才可用。很高兴知道它不是!

标签: regex vim match multiline


【解决方案1】:

第一次尝试 (match(getline(1, '$'), pattern)) 时,Vim 尝试在每一行 inside 中找到模式;由于您的模式是多行的,因此它永远不会匹配。

所以,您的第二次尝试朝着正确的方向前进,因为您尝试连接线条,那么模式将有效匹配...除非您使用 '\n' 作为连接的粘合剂:这个字符串几乎被替换为反斜杠 \ 后跟 n 字符。只需将单引号替换为双引号,就会解析特殊字符。

所以,这个版本会更好:

echo matchstr(join(getline(1,'$'), "\n"), pattern)

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 2016-11-17
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多