Regulärer Ausdruck – Finden Sie einen regulären Ausdruck in vim
天蓬老师
天蓬老师 2017-05-16 16:40:06
0
3
579

Der Originaltext wird wie folgt vereinfacht (mehrere Tabellenerstellungsanweisungen, einige Tabellen haben die gleichen Felder):

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

Ich muss die Tabellenerstellungsanweisungen auswählen, die field2 Felder in der Tabelle haben, also den folgenden Text auswählen

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

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

Ich dachte an eine reguläre RegelCREATE_.{-}F_class_type_.{-}ENGINE, aber damit stimmt offensichtlich etwas nicht.

So fügen Sie Einschränkungen hinzu, sodass im ausgewählten Text nur eine CREATE vorhanden ist, damit der ausgewählte Text korrekt ist. Danke.


Überprüfen Sie es selbst, schauen Sie sich einfach negativ um.

天蓬老师
天蓬老师

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

Antworte allen(3)
左手右手慢动作

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

解释一下,也方便以后自己查看
\v:任何元字符都不用加反斜杠
\_.:包括换行符的所有字符
(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`[\s\S]*?ENGINE=InnoDB

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage