首頁  >  問答  >  主體

正規表示式 - 求一個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 天前538

全部回覆(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
  • 取消回覆