2009-03-05 15 views
0

Die folgende Regex für Do-Dollar Dollar oder #do #Dollars oder #Dollar sein sollte, aber nicht für Doblabla (was es derzeit ist) etc ..PHP Regex Problem - Optionaler Text

/^@(?P<name>\w+) (?P<amount>\d+) [#]?Do(?:llars?)?/i 

Wie kann ich ändern Das? So dass es nicht paßt mehr auf Dogfood und Hunde etc ...

Update 3: Nicht Gelöst Afterall:

/^@(?P<name>\w+) (?P<amount>\d+) [#]?(do(?:llars?|s))/i 

Die folgenden paßt nicht:

@name 2 do 

Irgendwelche Gedanken?

Meine zweite Frage ist, wie kann ich es dann erlauben, auch zum Spiel:

Also am Ende Dox und #Dox ich es

@name 2 #do 
@name 2 do 
@name 2 #dollars 
@name 2 dollars 
@name 1 dollar 
@name 1 #dollar 
@name 2 dox 
@name 2 #dox 

und nichts anderes passen will.

Vielen Dank!

Ice

Antwort

2

Wenn mich nicht alles täuscht, schlägt (?:llars?)?, dass dies alles akzeptiert wird, beginnend mit tun und nicht, was danach ist, da es optional.

Fügen Sie ein $ an das Ende hinzu, um zu erzwingen, dass die Zeichenfolge in do oder dollar endet.

+0

Als ich füge einen $ bis zum Ende des Ausdrucks, die Quelle wie @name 5 Dollar, weil blabla Daher ausschließt, die nicht funktioniert hat - oder bin ich es falsch platziert? –

+0

Dieses Beispiel ist nicht auf Ihrer Liste. Sie sollten in der Frage klären, dass andere Wörter folgen können. –

1

die $ Anker Mit dem Ende der Leitung und den | Operator für Alternativen alt-1|alt-2|… markieren:

/^@(?P<name>\w+) (?P<amount>\d+) #?(do(?:llars?|x)?)$/i 
1

Ich fand die Antwort nach einigen weiteren Versuchen auf Regexp.net

[#]?(do(?:llars?)) 
+0

Dies passt nicht zu "@name 2 do" – Greg

+0

Oh nein!Du hast Recht - zurück zu Platz 1 –

2

Diese sollte es für Sie tun:

/^@(?P<name>\w+) (?P<amount>\d+) #?Do(?:llars?|x)(?:\s|$)/i 

Dies entspricht dem Namen und der Menge, gefolgt von einem optionalen #, dann "do", dann "llar", "llars", whitespace oder dem Ende des Strings.

+0

Ich hatte ein extra "?" in am Ende, die ich entfernt habe, so stellen Sie sicher, es endet $)/i, wenn Sie – Greg

+0

Edited wieder zu "dox" und nicht übereinstimmen "dollarsfoo" (aber immer noch übereinstimmen "Dollar" oder "Dollar foo") – Greg

+0

Vielen Dank du - das ist perfekt! Ich weiß es wirklich zu schätzen, dass Sie sich die Zeit genommen haben, mir dabei zu helfen. Es bringt mir eine Menge über Regex's, dass der Spickzettel nicht hat;) –

0

Vielleicht verstehe ich nicht total, aber Ihre Regex sieht zu komplex für mich. Was ist falsch daran, es so zu machen?

/^@name [12] #?do(llar|llars|x)?$/ 

Edit: nach dem Lesen der Kommentare über es klingt wie Sie andere Anforderungen haben, die Sie nicht in Frage gestellt hat. Bearbeiten Sie diese, so dass wir ein wirklich vollständiges Problem haben, an dem Sie arbeiten würden, würde die Dinge viel einfacher machen.