2011-01-14 8 views
0

ich einen regulären Ausdruck Dies hat drei Abschnitte sepearted durch KommaRegex beiliegt() Ausgabe

(\\w+[ ]*|-\\w+[ ]*)(!=|<=|>=|=|<|>| not in | in | not like | like)(.*) 

mit.

Wenn ich versuche, das wie gegen etwas zu passen

product(getProduct_abc) in (Xyz) 

Es ist nicht die Regex übereinstimmen.

Aber wenn ich versuche

100=product(getProduct_abc) in (Xyz) 

passen passt es perfekt.

Was ist los mit der Regex?

+0

Es sieht aus wie Sie versuchen, in einem regulären Ausdruck zu viel zu tun. Brechen Sie es ab und analysieren Sie die Zeichenfolge richtig. –

+0

Anon, dies ist der Reguläre Ausdruck, den unsere Geschäftsbenutzer zur Validierung geben. Wir können es nicht ändern. Bitte lassen Sie mich wissen, was der bessere Weg ist, es klar zu verstehen und zu analysieren. Jede Hilfe ist sehr geschätzt. – Preethi

+0

@Anon: Der reguläre Ausdruck, wie es unabhängig ist, ist in Ordnung. Wir können nicht beurteilen, ob es zu viel oder zu wenig versucht, weil wir Preethis Anforderungen nicht kennen. Ein komplexerer Parser kann für seine Bedürfnisse zu komplex sein - oder er könnte einen brauchen. Wir wissen einfach nicht genug über seine Aufgabe. – RobertB

Antwort

0

Nichts ist falsch, per se, mit dem regulären Ausdruck. Es stimmt einfach nicht mit der angegebenen Zeichenfolge überein.

Sie müssen eine gute Referenz zu regulären Ausdrücken finden und die Grundlagen lernen. Einer ist http://www.regular-expressions.info/. Das kann oder kann nicht eine gute Referenz für Sie als Anfänger sein. (. Ich sein RegexBuddy Werkzeug bin mit Ihrem regulären Ausdruck zu testen)

Hier ist eine grobe Aufteilung des Ausdrucks:

  • Es gibt drei einfangenden Gruppen, umgaben jeweils von einem eigenen Paar Klammern. (Beachten Sie, dass Klammern, zusammen mit vielen anderen Zeichen, in regulären Ausdrücken eine besondere Bedeutung haben. Um eine Klammer in einer Richtung zu finden, müssen Sie sie umgehen. Der angegebene reguläre Ausdruck führt dies nicht aus.)
  • In der ersten Erfassung Gruppe gibt es zwei mögliche Möglichkeiten für ein Match. Sie sind:
    • Ein oder mehr „Wort“ Zeichen, gefolgt von null oder mehr Leerzeichen oder
    • Ein Strich, gefolgt von einem oder mehrere „Wort“ Zeichen, gefolgt von null oder mehr Räumen
  • In In der zweiten Erfassungsgruppe gibt es 10 mögliche Übereinstimmungen: die aufgelisteten Operatorsymbole (ohne umgebende Leerzeichen) oder die aufgelisteten Textoperatoren (mit umgebenden Leerzeichen)
  • In der dritten Erfassungsgruppe stimmen null oder mehr eines beliebigen Zeichens überein .

Der String 'Produkt (getProduct_abc) in (xyz)' nicht auf die 'in' Betreiber dort, weil vor dem Match mehr als nur "Wort" Zeichen. Die Klammern werden nicht als "Wort" -Zeichen betrachtet und führen daher zum Fehlschlagen der Übereinstimmung.

Die zweite Zeichenfolge ('100 = product (getProduct_abc) in (Xyz)') stimmt überein, da sie das Gleichheitszeichen ('=') als übereinstimmenden Operator für die zweite Erfassungsgruppe verwendet. '100' ist eine Zeichenfolge für alle "Wort" -Zeichen und alles nach dem '=' stimmt mit dem Teil 'irgendein Zeichen' überein, so dass die Übereinstimmung erfolgreich ist. Je nachdem, wie das Ende der Zeichenfolge behandelt wird, stimmen einige Sprachen möglicherweise nicht mit dieser Zeichenfolge überein, wenn sie sich am Ende der Zeichenfolge befindet.

Wenn die erste Zeichenfolge ist angenommen zu entsprechen, dann müssen Sie mit Ihren geschäftlichen Benutzern überprüfen. Vielleicht sind sie auch Anfänger mit regulären Ausdrücken und haben dir einen gegeben, der nicht funktioniert.;-)

0

Das ist, was ich sehe:

'100=product(getProduct_abc) in (Xyz)' 
Group1 match = '100' 
Group2 match = '=' 
Group3 match = 'product(getProduct_abc) in (Xyz)' 

'product(getProduct_abc) in (Xyz)' 
     ^ 
    Fails here on Group1 match because parenthesis are not included in this group 

Sie die Situation indem das letzte Auftreten der Gruppe 1,2,3 Spiel in der Zeichenfolge beheben.
Reparieren/Umschreiben der gleichwertigen Group1-Übereinstimmung und Trennen der Gruppen, sie können erneut kombiniert werden, um die letzte Übereinstimmung zu erzwingen.

rxP1 = '(?:-?[\w()]+\ *)'; 
rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like)'; 
rxP3 = '(?:.*?)'; 

rxAll = /(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/; 

In Perl:

use strict; 
use warnings; 

my @samples = (
'product(getProduct_abc) in (Xyz1)', 
'100=product(getProduct_abc) in (Xyz2)', 
'100 like = != not like >product(getProduct_abc) in (Xyz3)', 
); 

my $rxP1 = '(?:-?[\w()]+\ *)'; 
my $rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like)'; 
my $rxP3 = '(?:.*?)'; 

for (@samples) 
{ 
    if (/(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/) { 
     print "\n1 = '$1'\n"; 
     print "2 = '$2'\n"; 
     print "3 = '$3'\n"; 
    } 
} 

Ausgang:

1 = 'product(getProduct_abc)' 
2 = ' in ' 
3 = '(Xyz1)' 

1 = 'product(getProduct_abc)' 
2 = ' in ' 
3 = '(Xyz2)' 

1 = 'product(getProduct_abc)' 
2 = ' in ' 
3 = '(Xyz3)'