2017-06-01 5 views
-1

J'ai littéralement passé deux jours complets à chercher ici, sur google et sur regex101 avant de le demander.
Voici ce que mes fichiers (en milliers d'entre eux) ressemblent:Remplacement de sublimetex Regex d'une chaîne récurrente dans un fichier texte après une chaîne spécifique

FIRST LINE THAT MIGHT CONTAIN ON . 
SECTION1 
SOME TEXT THAT MIGHT CONTAIN ON . 
SECTION2 
ON 04/1/2017 SOME TEXT 
ON 25/1/2017 SOME TEXT 
ON 15/2/2017 SOME TEXT 

Je dois enlever toutes les occurrences ON dans SECTION2 seulement.
Je ne peux évidemment pas poster les modèles qui n'ont pas fonctionné sur deux jours d'essais et d'erreurs. (Ce serait inonder les moteurs de recherche avec des choses non pertinentes prouvant ainsi que mes esprits limités - sur le sujet qui est ;-)

+0

Existe-t-il un fichier 'SECTION3' ou après le contenu de' SECTION2' le fichier est-il terminé? – acdcjunior

+0

Il n'y a pas de SECTION3. C'est à peu près le modèle des fichiers. (bien que j'aie envisagé d'ajouter un "tag" à la fin de chaque fichier mais je ne serai pas en mesure de tous les vérifier, il doit être sûr) – manuchap

+1

Si vous êtes sûr que ces ON de SECTION2 sont toujours au début de la ligne (et SECTION1 et les autres ne le sont pas), vous pouvez utiliser '^ ON '. – acdcjunior

Répondre

1

Vous pouvez le faire avec ce modèle:

(?:\G(?!\A)|\A(?>.*\R)*?SECTION2\h*\R)(?>.*\R)*?\KON\h 

demo

L'idée est de créer un modèle qui ne peut renvoyer que des correspondances contiguës à l'aide de l'ancre \G. Cette ancre réussit au début de la chaîne ou à la position après une correspondance réussie.

détails Pattern:

(?: # non-capturing group: two possible starts 
    \G(?!\A) # the position after a previous match 
    |   # OR 
    \A(?>.*\R)*?SECTION2\h*\R # reach the first occurrence of SECTION2 from the start 
) 
(?>.*\R)*? # match lazily eventual lines that don't start with ON 
\K   # remove all on the left from the match result 
ON\h  # and keep only ON with a trailing space 

(?!\A) interdit la première branche pour réussir au début de la chaîne, de cette façon le premier match utilise toujours la deuxième branche (une seule fois depuis qu'il commence par \A). Les prochains matchs utilisent toujours la première branche. Cela force toutes les occurrences de ON à être après SECTION2.

+1

Génial! Merci beaucoup, et merci pour les explications aussi.Gloubiboulga massive à vous ;-) (un tel soulagement ma colonne vertébrale effectivement fissuré) – manuchap