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>