Vim多行匹配以及排除字符串
Vim多行匹配以及排除字符串
原文地址:https://blog.zengrong.net/post/1429.html
一个很简单的需求,在下面的XML文件中匹配 <frame>
块。
一开始写了一个:
1^\s\+<frame>\_[^\(frame\)]*<\/frame>
这样能达到需求,但是却是凑巧。
因为 [^\(frame\)]
其实并不会匹配一个frame字符串,它依然是将组中的字符串单独对待的。如果在<frame>
块之间包含frame中的任何一个字符串,那么匹配就会失败。
凑巧的是,正好在下面的范例中,并没有出现这样的情况。
既然有问题,那么就修改下,最终的版本是这样的:
1^\s\+<frame>\(frame\)\@!\_.*<\/frame>
\@!
相当于 perl正则表达式中的 ?!
,它的含义是“不匹配一个组”。\@!
后面需要跟 .
来确定匹配范围。为了匹配换行,这里使用了\_.
。
Vim的正则格式真是不走寻常路啊……无处不在的转义和非转义让人崩溃……
1<?xml version="1.0" encoding="UTF-8"?>
2<metadata>
3 <frames>
4 <frame>
5 <x>0</x>
6 <y>0</y>
7 <w>70</w>
8 <h>124</h>
9 <ox>-10</ox>
10 <oy>-1</oy>
11 <ow>70</ow>
12 <oh>124</oh>
13 </frame>
14 <frame>
15 <x>70</x>
16 <y>0</y>
17 <w>53</w>
18 <h>124</h>
19 <ox>-10</ox>
20 <oy>-2</oy>
21 <ow>53</ow>
22 <oh>124</oh>
23 </frame>
24 <frame>
25 <x>123</x>
26 <y>0</y>
27 <w>68</w>
28 <f>aaa</f>
29 <h>124</h>
30 <ox>-7</ox>
31 <oy>-2</oy>
32 <ow>68</ow>
33 <oh>124</oh>
34 </frame>
35 <frame>
36 <x>191</x>
37 <y>0</y>
38 <w>75</w>
39 <h>124</h>
40 <ox>-9</ox>
41 <oy>-2</oy>
42 <ow>75</ow>
43 <oh>124</oh>
44 </frame>
45 <frame>
46 <x>266</x>
47 <y>0</y>
48 <w>75</w>
49 <h>123</h>
50 <ox>-26</ox>
51 <oy>-3</oy>
52 <ow>75</ow>
53 <oh>123</oh>
54 </frame>
55 </frames>
56</metadata>
- 文章ID:1429
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/vim_reg_multiline_and_unmatch_string/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。