recherche

Maison  >  Questions et réponses  >  le corps du texte

Expression régulière - trouver une expression régulière dans vim

Le texte original est simplifié comme suit (plusieurs instructions de création de tables, certaines tables ont les mêmes champs) :

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

Je dois sélectionner les instructions de création de table qui ont field2 champs dans la table, c'est-à-dire sélectionner le texte suivant

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

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

J'ai pensé à une règle régulièreCREATE_.{-}F_class_type_.{-}ENGINE, mais il y a évidemment quelque chose qui ne va pas avec cela.

Comment ajouter des restrictions pour qu'il n'y ait qu'un seul CREATE dans le texte sélectionné, afin que le texte sélectionné soit correct. Merci.


Vérifiez-le vous-même, utilisez simplement un regard négatif autour de vous.

天蓬老师天蓬老师2755 Il y a quelques jours558

répondre à tous(3)je répondrai

  • ringa_lee

    ringa_lee2017-05-16 16:42:06

    J'ai vérifié à nouveau les règles habituelles et j'ai découvert que l'utilisation d'une recherche négative peut résoudre ce problème.
    Collez d'abord l'expression régulière correcte : vCREATE(_.(CREATE)@!){-}field2_.{-}ENGINE.*vCREATE(_.(CREATE)@!){-}field2_.{-}ENGINE.*

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

    使用否定环视后就能保证匹配出的结果只有一个CREATE

    Expliquez-le, il vous sera également pratique de vérifier plus tard🎜v : Aucune barre oblique inverse n'est requise pour les métacaractères🎜_. : Tous les caractères, y compris les sauts de ligne🎜( CREATE)@! : recherche négative séquentielle🎜(_.(CREATE)@!){-} : correspondance non gourmande d'un caractère et le résultat correspondant ne contient pas CRÉERChaîne🎜 🎜L'utilisation d'une recherche négative peut garantir que le résultat correspondant n'aura qu'une seule chaîne CREATE, c'est-à-dire que le résultat correspondant n'aura pas plusieurs instructions de création de table🎜

    répondre
    0
  • 漂亮男人

    漂亮男人2017-05-16 16:42:06

    Autre idée : utilisez 应该也可以

     :vim some.sql
     /field2
     qa{V}:w! >> wanted.sql
     nq
     99@a
    
    • 前提是每个创建语句行间不能有空行,首尾要有空行, 参见 :h {
    • 99@a 中的99 可以通过 %/field2//n pour obtenir

    répondre
    0
  • 世界只因有你

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

    J'en ai écrit un avec désinvolture et j'ai réussi le test en sublime. Pour référence :

    CRÉER UNE TABLE .*s.*`field2`[sS]*?ENGINE=InnoDB

    répondre
    0
  • Annulerrépondre