原始文字簡化如下(好幾個建表語句,有些表中有相同的欄位):
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
,這樣選出的就是正確的了。謝謝。
自己又查了查,使用否定環視就可以了。
ringa_lee2017-05-16 16:42:06
又查了一下正規則,使用否定環視就能解決這個問題。
先貼正確的正規:vCREATE(_.(CREATE)@!){-}field2_.{-}ENGINE.*
解釋一下,也方便以後自己查看v
:任何元字元都不用加反斜線_.
:包含換行符的所有字元v
:任何元字符都不用加反斜杠_.
:包括换行符的所有字符(CREATE)@!
:顺序否定环视(_.(CREATE)@!){-}
:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE
( CREATE)@!
:順序否定環視
(_.(CREATE)@!){-}
:非貪婪匹配任意字符,並且匹配出的結果中不含有字符串CREATE
漂亮男人2017-05-16 16:42:06
另外的思路: 用 宏
應該也可以
:vim some.sql
/field2
qa{V}:w! >> wanted.sql
nq
99@a
:h {
99@a
中的99
可以通过 %/field2//n
取得世界只因有你2017-05-16 16:42:06
隨手寫了一個,在sublime中測試通過。供參考:
CREATE TABLE .*s.*`field2`[sS]*?ENGINE=InnoDB