suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Regulärer Ausdruck – Finden Sie einen regulären Ausdruck in vim

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.

天蓬老师天蓬老师2757 Tage vor565

Antworte allen(3)Ich werde antworten

  • ringa_lee

    ringa_lee2017-05-16 16:42:06

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

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

    使用否定环视后就能保证匹配出的结果只有一个CREATE字符串,也就是匹配结果不会有多条建表的语句

    Antwort
    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 获取

    Antwort
    0
  • 世界只因有你

    世界只因有你2017-05-16 16:42:06

    随手写了一个,在sublime中测试通过。供参考:

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

    Antwort
    0
  • StornierenAntwort