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