2012-03-25 11 views
0

Ich habe diese Regex, die 1 = 'aa' oder 1 = "aa" oder 1 = aa übereinstimmen soll, und Rückgabewert/Wert.Übereinstimmung, bis Regex-Ausdruck nicht richtig funktioniert

(?<number>\d)=\s*("|')?\s*(?<value>.*?)(?=("|')?\d=|$) 

es funktioniert, aber es gibt den Wert falsch zurück. Zahl kommt zurück als 1, aber Wert als aa“im Fall von 1 =‚aa‘

Wie kann ich Wert bekommen = aa für den Fall von 1 =‚aa‘.

Actual Ausdruck 1 enthält = 'aa' 2 = "bB" 3 = cc usw.

Antwort

3

Das Hauptproblem dabei ist, dass das:

(?=("|')?\d=|$) 

Mittel „, gefolgt von einem der folgenden Eigenschaften:

  • " plus eine Ziffer und =
  • ' plus eine Ziffer und =
  • eine Ziffer und =
  • End-of-string

“. Sie werden bemerken, dass es nicht macht, geben Sie für whitespace zwischen dem " oder ' und der Ziffer; so im Fall von 1="aa" 2=..., ist die value einfach nicht erlaubt, gefolgt von " 2=.... Ähnlich macht es nicht machen Sie irgendeine Erlaubnis für " oder ' plus Ende der Schnur.

So ist die minimale fix ist — ja zu ermöglichen, erfordern — einige Leerzeichen vor der Ziffer und die ("|')? aus der Look-Ahead-Behauptung zu bewegen und in den Hauptteil des Regex:

("|')?(?=\s+\d=|$) 

Geben:

(?<number>\d)=\s*("|')?\s*(?<value>.*?)("|')?(?=\s+\d=|$) 

Während wir gerade dabei sind, wir auch vielleicht einige andere Optimierungen machen die Regex zu vereinfachen und die Anzahl der Fälle zu reduzieren, wo es WRO gehen ng:

(?<number>\d)=\s*(["']?)(?<value>.*?)\1(?=\s+\d=|$) 

(. Weitere Bereinigung möglich sein kann, aber ich weiß nicht genug über Ihre Daten noch weitere Änderungen empfehlen)

+0

Danke es ist richtig funktioniert Beim kopieren von sO, ist es auch Kopien eine neue Linie und so war es nicht richtig funktioniert Vielen Dank für Ihre Hilfe –

+0

@AlexJ?....: Gern geschehen! – ruakh

0

Versuchen

(?<number>\d)=\s*("|')?\s*(?<value>.+?)("|')?(\s|$) 

Es wird funktionieren, wenn Auf eine Zuweisung folgt entweder ein Leerzeichen oder ein Zeilenende.

+0

Ich habe meine Antwort bearbeitet, da meine vorherige Lösung nur für einzelne Aufgaben funktioniert hat. –

1

Halten Sie es einfach. Der einfachste und lesbarste Weg, genau Paare von Anführungszeichen (die identisch sind, z.mag es nicht: 1='aa") ist folgend:

(
(
    (?P<number>\d)="(?P<value>[^"]+)"  #or * in stead of + if value can be empty 
) | 
(
    (?P<number>\d)='(?P<value>[^']+)'  #or * in stead of + if value can be empty 
) | 
(
    (?P<number>\d)=(?P<value>[^\s]+)  #here you should also choose where you stop 
) 
) 
0

Andere Punkte zu beachten:

  • Ihr ursprünglicher Ausdruck (aber nicht Ihr Beispiel) scheint beabsichtigt zu Leerzeichen zu unterstützen in der Nähe von dem Gleichheitszeichen.
  • Muss Ihre Nummer mehrere Ziffern unterstützen?
  • eckige Klammern für optionale Zeichen verwenden kann unnötige Einfanggruppen

    (? <Nummer> \ d +) vermeiden \ s * = \ s * [ "']? (? <Wert> [^"' \ s +]) [ " ']