猿问

求一个vim中的正则

原始文本简化如下(好几个建表语句,有些表中有相同的字段):
CREATETABLE`test1`(
`field1`int,
)ENGINE=InnoDB
CREATETABLE`test2`(
`field1`int,
)ENGINE=InnoDB
CREATETABLE`test3`(
`field2`int,
)ENGINE=InnoDB
CREATETABLE`test4`(
`field3`int,
)ENGINE=InnoDB
CREATETABLE`test5`(
`field2`int,
)ENGINE=InnoDB
我需要把表中有field2字段的建表语句选出来,也就是把下面的文本选出来
CREATETABLE`test3`(
`field2`int,
)ENGINE=InnoDB
CREATETABLE`test5`(
`field2`int,
)ENGINE=InnoDB
想到了一个正则CREATE\_.\{-}F_class_type\_.\{-}ENGINE,但这个显然有问题。
怎样加限制条件使选出的文本中只有一个CREATE,这样选出的就是正确的了。谢谢。
自己又查了查,使用否定环视就可以了。
慕田峪7331174
浏览 338回答 2
2回答

达令说

又查了一下正则,使用否定环视就能解决这个问题。先贴正确的正则:\vCREATE(\_.(CREATE)@!){-}field2\_.{-}ENGINE.*解释一下,也方便以后自己查看\v:任何元字符都不用加反斜杠\_.:包括换行符的所有字符(CREATE)@!:顺序否定环视(\_.(CREATE)@!){-}:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE字符串使用否定环视后就能保证匹配出的结果只有一个CREATE字符串,也就是匹配结果不会有多条建表的语句

PIPIONE

另外的思路:用宏应该也可以:vimsome.sql/field2qa{V}:w!>>wanted.sqlnq99@a前提是每个创建语句行间不能有空行,首尾要有空行,参见:h{99@a中的99可以通过%/field2//n获取
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答