vim 正则表达式多行:搜索有效,match() 无效
vim regex multiline: search works, match() doesn't
假设我有这个缓冲区:
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)
第一次尝试 (match(getline(1, '$'), pattern)
),Vim 尝试在每行 中找到 模式;由于您的模式是多行的,因此它永远不会匹配。
所以,你的第二次尝试朝着正确的方向前进,因为你尝试连接线,然后模式将有效匹配......除非你使用 '\n'
作为连接的粘合剂:这个字符串被反斜杠 \
后跟 n
字符替换。只需将单引号替换为双引号,然后将解析特殊字符。
所以,这个版本会更好用:
echo matchstr(join(getline(1,'$'), "\n"), pattern)
假设我有这个缓冲区:
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)
第一次尝试 (match(getline(1, '$'), pattern)
),Vim 尝试在每行 中找到 模式;由于您的模式是多行的,因此它永远不会匹配。
所以,你的第二次尝试朝着正确的方向前进,因为你尝试连接线,然后模式将有效匹配......除非你使用 '\n'
作为连接的粘合剂:这个字符串被反斜杠 \
后跟 n
字符替换。只需将单引号替换为双引号,然后将解析特殊字符。
所以,这个版本会更好用:
echo matchstr(join(getline(1,'$'), "\n"), pattern)