首页  >  问答  >  正文

正则表达式 - 求一个vim中的正则

原始文本简化如下(好几个建表语句,有些表中有相同的字段):

CREATE TABLE `test1` (
  `field1` int,
) ENGINE=InnoDB

CREATE TABLE `test2` (
  `field1` int,
) ENGINE=InnoDB

CREATE TABLE `test3` (
  `field2` int,
) ENGINE=InnoDB

CREATE TABLE `test4` (
  `field3` int,
) ENGINE=InnoDB

CREATE TABLE `test5` (
  `field2` int,
) ENGINE=InnoDB

我需要把表中有field2字段的建表语句选出来,也就是把下面的文本选出来

CREATE TABLE `test3` (
  `field2` int,
) ENGINE=InnoDB

CREATE TABLE `test5` (
  `field2` int,
) ENGINE=InnoDB

想到了一个正则CREATE_.{-}F_class_type_.{-}ENGINE,但这个显然有问题。

怎样加限制条件使选出的文本中只有一个CREATE,这样选出的就是正确的了。谢谢。


自己又查了查,使用否定环视就可以了。

天蓬老师天蓬老师2733 天前535

全部回复(3)我来回复

  • ringa_lee

    ringa_lee2017-05-16 16:42:06

    又查了一下正则,使用否定环视就能解决这个问题。
    先贴正确的正则:vCREATE(_.(CREATE)@!){-}field2_.{-}ENGINE.*

    解释一下,也方便以后自己查看
    v:任何元字符都不用加反斜杠v:任何元字符都不用加反斜杠
    _.:包括换行符的所有字符
    (CREATE)@!:顺序否定环视
    (_.(CREATE)@!){-}:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE_.:包括换行符的所有字符

    (CREATE)@!:顺序否定环视

    (_.(CREATE)@!){-}:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE字符串

    🎜使用否定环视后就能保证匹配出的结果只有一个🎜字符串,也就是匹配结果不会有多条建表的语句🎜

    回复
    0
  • 漂亮男人

    漂亮男人2017-05-16 16:42:06

    另外的思路: 用 应该也可以

     :vim some.sql
     /field2
     qa{V}:w! >> wanted.sql
     nq
     99@a
    
    • 前提是每个创建语句行间不能有空行,首尾要有空行, 参见 :h {
    • 99@a 中的99 可以通过 %/field2//n 获取

    回复
    0
  • 世界只因有你

    世界只因有你2017-05-16 16:42:06

    随手写了一个,在sublime中测试通过。供参考:

    CREATE TABLE .*s.*`field2`[sS]*?ENGINE=InnoDB

    回复
    0
  • 取消回复