web-dev-qa-db-fra.com

Utilisation d'expressions régulières pour remplacer en masse dans Notepad ++ et Vim

J'ai donc un gros fichier texte qui ressemble à ceci:

<option value value='1' >A
<option value value='2' >B
<option value value='3' >C
<option value value='4' >D

Cela fait plusieurs centaines de lignes et je ne veux vraiment pas le faire manuellement. L'expression que j'essaie d'utiliser est:

<option value='.{1,}' >

Qui fonctionne comme prévu lorsque je l'exécute via plusieurs testeurs d'expression régulière en ligne. En gros, je veux tout supprimer avant A, B, C, etc. Le problème, c'est que lorsque j'essaie d'utiliser cette expression dans Vim et Notepad ++, il ne semble rien y trouver.

31
Mike

Tout ce qui précède leA,B,C, etc.

Cela semble si simple que je dois vous mal interpréter. C'est juste

:%s/<.*>//
20
Whaledawg

Dans Notepad ++, vous n'avez pas besoin d'utiliser des expressions régulières pour cela.

Maintenez la touche Alt enfoncée pour vous permettre de sélectionner un rectangle de texte sur plusieurs lignes à la fois. Sélectionnez le morceau dont vous souhaitez vous débarrasser, puis appuyez sur la touche Suppr.

63
GlennS

Dans le Bloc-notes ++:

<option value value='1' >A
<option value value='2' >B
<option value value='3' >C
<option value value='4' >D


Find what: (.*)(>)(.)
Replace with: \3

Replace All


A
B
C
D
30
sdgfsdg

Il y a une solution très simple à cela à moins que je n'aie pas compris le problème. L'expression régulière suivante:

(.*)(>)(.*)

correspondra au modèle spécifié dans votre message.

Donc, dans notepad ++, vous trouvez (.*)(>)(.*) et vous le remplacez par \3.

Les expressions régulières sont fondamentalement gourmandes en ce sens que si vous spécifiez (.*), cela correspond à toute la ligne et vous souhaitez le décomposer de manière à ce que vous puissiez extraire la chaîne que vous souhaitez conserver. Ici, j’ai fait exactement la même chose et cela fonctionne très bien dans Notepad ++ et Editplus3.

8
andHapp

Votre solution d'origine pose deux problèmes. Tout d'abord, votre exemple de texte:

<option value value='1' >A

a deux occurrences du mot "valeur". Votre regex ne le fait pas. De plus, vous devez sortir de l’attelle d’ouverture dans le quantificateur de votre regex ou Vim l’interprétera comme une accolade littérale. Cette expression rationnelle fonctionne:

:%s/<option value value='.\{1,}' >//g
7
rmeador

Cela va supprimer la balise option et laisser les lettres dans vim:

:%s/<option.*>//g
6
xsl

Cela peut aider si vous êtes moins précis. Votre expression est "gourmande" et peut être interprétée de différentes manières par différents programmes Essayez ceci dans vim:

%s/^<[^>]+>//
4
Lucas Oman

En vim

:%s/<option value='.\{1,}' >//

ou

:%s/<option value='.\+' >//

Dans les expressions rationnelles vim, vous devez échapper au symbole un ou plus, en capturant les parenthèses, Le nombre délimité par des accolades et quelques autres.

Voir :help /magic pour voir quels caractères spéciaux doivent être ignorés (et comment changer cela).

3
rampion

Dans le bloc-notes ++

Chercher

(<option value="\w\w">)\w+">(.+)

Remplacer par

\1\2
3
helpful anonymous

Ayant le même problème (avec jQuery "done ...", mais seulement dans Notepad ++, j'ai reçu de bonnes réponses amicales (qui m'ont permis de comprendre ce que j'avais manqué), puis j'ai passé du temps à construire une étape détaillée en plusieurs étapes, voir Recherche d'une ligne commençant à l'aide d'une expression régulière dans le Bloc-notes ++

Versailles, mardi 27 avril 2010 22:53:25 +0200

2
Michel Merlin

Notepad ++: Mode de recherche = expression régulière

Trouver quoi: (. *>) (.)

Remplacer par:\2

2
Vuttipong L.

Un peu après les faits, mais au cas où cela serait utile à qui que ce soit, j’ai pu suivre l’un des exemples présentés ici (par sdgfsdg) et choisir rapidement Expressions régulières pour Notepad ++.

De même, j'ai dû extraire des données redondantes d'une liste d'options déroulantes de sélection HTML, de la forme:

<select>
  <option value="AC">saint_helena">Ascension Island</option>
  <option value="AD">andorra">Andorra</option>
  <option value="AE">united_arab_emirates">United Arab Emirates</option>
  <option value="AF">afghanistan">Afghanistan</option>:
  ...
</select>

Et ce que je voulais vraiment, c'était:

<select>
  <option value="AC">Ascension Island</option>
  <option value="AD">Andorra</option>
  <option value="AE">United Arab Emirates</option>
  <option value="AF">Afghanistan</option>
  ...
</select>

Après avoir tiré les cheveux en quatre, j'ai réalisé qu'à partir de la version 5.8.5 (septembre 2010), les expressions rationnelles ne semblaient toujours pas autoriser certaines boucles dans les expressions (à moins qu'il y ait une autre syntaxe), par exemple, ce qui suit trouverait même "> united_arab_emirated_emirates"> malgré ses traits de soulignement supplémentaires:

(">)([a-z]+([_]*[a-z]*)*)(">)

Cette requête a fonctionné dans les outils les plus génériques RegEx mais au sein de Notepad ++, je devais comptabiliser manuellement le nombre maximal de caractères de soulignement imbriqués (qui était malheureusement de 8), en utilisant le beaucoup plus laid:

(">)([a-z]+[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*)[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*(">)

Si quelqu'un connaît un moyen de simuler une boucle Regex dans la fonctionnalité de remplacement du Notepad ++, veuillez me le faire savoir.


Trouver quoi: * (">) ([az] + [_] [az] [_] [az] [_] [az] [_] [az]) [_] [az] [_] [az] [_] [az] [_] [az] (">) *


Remplacer par: _ ​​">


Résultat: _ ​​255 occurrences ont été remplacées. _

1
bcmoney

Cela fonctionnera. Testé dans mon vim. les guillemets simples sont le problème.

1,$s/^<option value value=['].['] >/
1
J.J.

Voici un bel article sur Notepad ++ Expressions régulières
http://markantoniou.blogspot.com/2008/06/notepad-how-to-use-regular-expressions.html

1
crowne

Vim:

:% s /.*> //

1
akr

Très simple il suffit de trouver:

<option value value=.*?>

et cliquez sur Remplacer

0
Ibrahim Akbar