上一主题下一主题
关键字
主题 : 求一个vim中的正则
级别: 北风技术菜鸟

UID: 517343
精华: 0
发帖: 441
威望: 1700 点
学点: 863 点
贡献: 71 点
好评: 0 点
学币: 0 个
注册时间: 2014-11-02
最后登录: 2015-04-07
楼主  发表于: 2015-02-19 16:06||

求一个vim中的正则

原始文本简化如下(好几个建表语句,有些表中有相同的字段): ,|"tLN *m  
2<yi8O\  
CREATE TABLE `test1` ( .jZmQtc  
  `field1` int, 6/T hbD-C  
) ENGINE=InnoDB #wNksh/J^  
`z-4OJ8~  
CREATE TABLE `test2` ( 2K!3+D"  
  `field1` int, L"1UUOKy  
) ENGINE=InnoDB N/TU cG|m\  
^T)HRT-k  
CREATE TABLE `test3` ( "dXRUg"  
  `field2` int, A0cC) bd&  
) ENGINE=InnoDB iT% aAVs  
#c'yAa  
CREATE TABLE `test4` ( IaH8#3+a  
  `field3` int, n wToZxHZ~  
) ENGINE=InnoDB 92WvD  
%8>s:YG  
CREATE TABLE `test5` ( O>w Gc8Of\  
  `field2` int, rm;'/l8Y-E  
) ENGINE=InnoDB Ps+0qqT*  
我需要把表中有field2字段的建表语句选出来,也就是把下面的文本选出来 wRgmw 4  
+b.<bb6  
CREATE TABLE `test3` ( d `>M-:dF  
  `field2` int, $}jp=?,t  
) ENGINE=InnoDB `g<@F^x5  
1% ]| O  
CREATE TABLE `test5` ( ,icgn e1j  
  `field2` int, V'#dY~E-P  
) ENGINE=InnoDB dD?1t e  
想到了一个正则CREATE\_.\{-}F_class_type\_.\{-}ENGINE,但这个显然有问题。 xKWqDt  
X,IjM&o"Y  
怎样加限制条件使选出的文本中只有一个CREATE,这样选出的就是正确的了。谢谢。 r )ZUeHt}w  
=\B{)z7@6D  
自己又查了查,使用否定环视就可以了。
此帖悬赏中(剩余时间:已结束)...
最佳答案: 2 学点
热心助人剩余点数: 1 学点
级别: 北风资深评论员


UID: 497728
精华: 0
发帖: 3911
威望: 5495 点
学点: 6103 点
贡献: 172 点
好评: 0 点
学币: 67 个
注册时间: 2014-09-06
最后登录: 2015-04-07
沙发(1楼)  发表于: 2015-02-19 16:26||

又查了一下正则,使用否定环视就能解决这个问题。 :w_F<2d0 0  
先贴正确的正则:\vCREATE(\_.(CREATE)@!){-}field2\_.{-}ENGINE.* vVyO}Q`  
Js+d4``W  
解释一下,也方便以后自己查看 &ukNzV}VW  
\v:任何元字符都不用加反斜杠 =D5@PHpv(  
\_.:包括换行符的所有字符 $Br^c< y  
(CREATE)@!:顺序否定环视 dQM# -t4*  
(\_.(CREATE)@!){-}:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE字符串 ZC"6B(d  
SUD]Wl7G`r  
使用否定环视后就能保证匹配出的结果只有一个CREATE字符串,也就是匹配结果不会有多条建表的语句
级别: 北风资深评论员


UID: 497728
精华: 0
发帖: 3911
威望: 5495 点
学点: 6103 点
贡献: 172 点
好评: 0 点
学币: 67 个
注册时间: 2014-09-06
最后登录: 2015-04-07
板凳(2楼)  发表于: 2015-02-19 16:26||

另外的思路: 用 宏 应该也可以 BDRVT Y(s  
}.cmiC  
:vim some.sql +fQL~ 0tA  
/field2 25n (&NV  
qa{V}:w! >> wanted.sql rOH W  
nq )xx/di  
99@a t/WnDR/fM  
前提是每个创建语句行间不能有空行,首尾要有空行, 参见 :h { }l?_Cfvu  
99@a 中的99 可以通过 %/field2//n 获取
级别: 北风资深评论员


UID: 497728
精华: 0
发帖: 3911
威望: 5495 点
学点: 6103 点
贡献: 172 点
好评: 0 点
学币: 67 个
注册时间: 2014-09-06
最后登录: 2015-04-07
地板(3楼)  发表于: 2015-02-19 16:26||

随手写了一个,在sublime中测试通过。供参考: ^A9 M;q  
(dqCa[  
CREATE TABLE .*\s.*`field2`[\s\S]*?ENGINE=InnoDB