正規表示式 - 求一個vim中的正規表示
天蓬老师
天蓬老师 2017-05-16 16:40:06
0
3
548

原始文字簡化如下(好幾個建表語句,有些表中有相同的欄位):

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,這樣選出的就是正確的了。謝謝。


自己又查了查,使用否定環視就可以了。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(3)
左手右手慢动作

又查了一下正規則,使用否定環視就能解決這個問題。
先貼正確的正規:vCREATE(_.(CREATE)@!){-}field2_.{-}ENGINE.*

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

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

字符串CREATE

使用否定環視後就能保證符合的結果只有一個🎜字串,也就是符合結果不會有多條建表的語句🎜
漂亮男人

另外的思路: 用 應該也可以

 :vim some.sql
 /field2
 qa{V}:w! >> wanted.sql
 nq
 99@a
  • 前提是每個創建語句行間不能有空行,首尾要有空行, 參見 :h {
  • 99@a 中的99 可以通过 %/field2//n 取得
世界只因有你

隨手寫了一個,在sublime中測試通過。供參考:

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板