2010-07-21 9 views
9

ich einen regulären Ausdruck haben, die eine Zeichenfolge durchquert und 40 Werte zieht, sieht es sortieren, wenn wie die Abfrage unten, aber viel größer und komplizierterRegex Ausdruck mehr als 9 Werte in eine Referenz zu sichern ersetzen

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> 

Meine Frage ist, wie verwende ich diese Ausdrücke mit dem Befehl ersetzen, wenn die Zahl 9 überschreitet. Es scheint, als ob ich immer \10 den Wert für \1 verwendet und dann eine 0 an das Ende anfügt.

Jede Hilfe würde geschätzt vielen Dank :)

auch UEStudio Ich verwende, aber wenn ein anderes Programm tut es besser als kein großes Problem :)

+5

In Sublime Text funktioniert "\ 10" entweder nicht, aber "$ 10" funktioniert. –

Antwort

3

Die meisten der einfachen Regex Motoren von Editoren sind nicht für mehr als 10 übereinstimmende Gruppen ausgestattet; es scheint nicht wie UltraEdit kann. Ich habe gerade Notepad ++ ausprobiert und es wird nicht einmal passen ein Regex mit 10 Gruppen.

Ihre beste Wette, ich denke, ist etwas schnell in einer schnellen Sprache mit einem anständigen Regex-Parser zu schreiben. aber das würde die Frage nicht beantworten, wie

Hier ist etwas in Python gefragt:

import re 

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

Beachten Sie, dass Python Rückreferenzierungen wie \20 erlaubt: um 2 durch eine wörtliche folgte eine Rückreferenzierung zu einer Gruppe zu haben, 0, müssen Sie \g<2>0 verwenden, was eindeutig ist.

Edit: meisten Aromen von regex und Editoren, die einen Regex-Engine enthalten, sollte die Syntax ersetzen folgen wie folgt:

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. 

Benannte Referenzen sind in der Regel nur in sehr spezifischen Geschmack von regex Bibliotheken, Test Ihr Werkzeug, um es sicher zu wissen.

+2

"Manche Leute denken, wenn sie mit einem Problem konfrontiert werden:" Ich weiß, ich werde reguläre Ausdrücke verwenden. "Jetzt haben sie zwei Probleme." - Jamie Zawinski das oben genannte Zitat schien nie so wahr :( danke für die Hilfe :) –

1

Wenn Sie nicht mehr als 9 Untergruppen verwalten können, warum nicht zunächst Gruppen von 9 und dann Schleife und gelten Regexe auf diese Übereinstimmungen?

, d.h. zuerst (<test.*/test>)+ und dann für jede Untergruppenübereinstimmung auf <test(.*)/test>.

+0

Leider in meinem Fall würde das nicht funktionieren, das Muster ist ziemlich groß. Allerdings schätze ich den Vorschlag. Danke :) –

9

Wie von psycho brm hingewiesen: Verwenden Sie $ 10 statt \ 10 Ich benutze Notepad ++ und es funktioniert schön.

1

Versuchen Sie, benannte Gruppen zu verwenden; so statt der zehnte:

(.*) 

Verwendung:

(?<group10>.*) 

und dann verwenden Sie die folgende ersetzen string:

${group10} 

(Das ist natürlich in Ermangelung einer besseren Lösung mit Looping Beachten Sie, dass abhängig von Ihrer Umgebung möglicherweise unterschiedliche Regex-Syntaxaromen vorhanden sind.)

+0

Dies funktionierte für mich bei der Verwendung von Regex-Matching in nginx, die nicht mehr als 9 Gruppen zu entsprechen scheint. Gleiches Problem, bei dem $ 10 als $ 1 + 0 interpretiert wird. – theChumpus

0

setzen Sie ein $ vor der zweistelligen Untergruppe: z. \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8 \ 9 $ 10 Es hat bei mir funktioniert.

Verwandte Themen