2010-07-21 17 views
9

J'ai une expression regex qui traverse une chaîne et tire 40 valeurs, il ressemble un peu si comme la requête ci-dessous, mais beaucoup plus grande et plus complexeexpression Regex à dos référence plus de 9 valeurs dans un remplacement

est(.*)/test>test>(.*)<test><test>(.*)test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test> 

Ma question est comment puis-je utiliser ces expressions avec la commande de remplacement lorsque le nombre dépasse 9. Il semble que si j'utilise \10, il renvoie la valeur pour \1, puis ajoute un 0 à la fin.

Toute aide serait très apprécié merci :)

Aussi je me sers UEStudio, mais si un autre programme ne le fait mieux alors pas trop grave :)

+5

Dans Sublime Text, "\ 10" ne fonctionne pas non plus, mais "10 $" FONCTIONNE. –

Répondre

3

La plupart des simples moteurs utilisés par les éditeurs Regex ne sont pas équipés pour gérer plus de 10 groupes correspondants; il ne semble pas UltraEdit peut. Je viens d'essayer Notepad ++ et il ne sera même pas correspondre une regex avec 10 groupes.

Votre meilleur pari, je pense, est d'écrire quelque chose rapidement dans une langue rapide avec un analyseur regex décent. mais ce ne serait pas répondre à la question posée

Voici quelque chose en Python:

import re 

pattern = re.compile('(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)') 
with open('input.txt', 'r') as f: 
    for line in f: 
     m = pattern.match(line) 
     print m.groups() 

Notez que Python permet des références arrières tels que \20: afin d'avoir un backreference au groupe 2 suivi d'un littéral 0, vous devez utiliser \g<2>0, ce qui est sans ambiguïté.

Edit: La plupart des saveurs de regex, et les éditeurs qui comprennent un moteur de regex, devrait suivre la remplacer la syntaxe comme suit:

abcdefghijklmnop 
search: (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(?<name>.)(.) 
note: 1 2 3 4 5 6 7 8 9 10 11 12 13 
value: a b c d e f g h i j k l m 
replace result: 
    \11  k1  i.e.: match 1, then the character "1" 
    ${12} l  most should support this 
    ${name} l  few support named references, but use them where you can. 

références nommées sont généralement possibles que dans la saveur très spécifique des bibliothèques regex, essai votre outil pour savoir à coup sûr.

+2

"Certaines personnes, lorsqu'elles sont confrontées à un problème, pensent" Je sais, je vais utiliser des expressions régulières. "Maintenant, elles ont deux problèmes." - Jamie Zawinski la citation ci-dessus n'a jamais semblé si vrai :( merci pour l'aide :) –

1

Si vous ne pouvez pas gérer plus de 9 sous-groupes, pourquoi ne pas initialiser des groupes de 9, puis boucler et appliquer des regex à ces correspondances?

, c'est-à-dire la première correspondance (<test.*/test>)+, puis pour chaque sous-groupe sur <test(.*)/test>.

+0

Malheureusement, dans mon cas, cela ne fonctionnerait pas, le motif est assez grand. Cependant j'apprécie la suggestion. Merci :) –

9

Comme indiqué par psycho brm: Utilisez $ 10 au lieu de \ 10 J'utilise notepad ++ et il fonctionne très bien.

1

Essayez d'utiliser des groupes nommés; donc au lieu de la dixième:

(.*) 

utilisation:

(?<group10>.*) 

puis utilisez la chaîne de remplacement suivante:

${group10} 

(C'est bien sûr en l'absence d'une meilleure solution en utilisant une boucle , et n'oubliez pas qu'il peut y avoir différentes syntaxes de syntaxe regex en fonction de votre environnement.

+0

Cela a fonctionné pour moi lors de l'utilisation de la correspondance regex dans nginx, qui ne semble pas aimer plus de 9 groupes. Même problème avec le PO où 10 $ est interprété comme 1 $ + 0. – theChumpus

0

mettre un $ devant le sous-groupe à deux chiffres: par ex. \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8 \ 9 $ 10 Ça a marché pour moi.