2010-10-19 7 views
5

Wie kann ich sagen, in regulären Ausdrücken:Hilfe mit besonderem Regular Expression - nicht irgendein String mit

Jeder Teil eines Strings mit einem Großbuchstaben beginnen, mindestens ein Leerzeichen enthält, nicht die Zeichenfolge enthält
" _ " (Speicherplatz Unterstrich Leerzeichen) und endet mit der Zeichenfolge "!!!" (ohne die Anführungszeichen)?

Ich habe Probleme mit dem "nicht enthalten" Teil.

Hier ist, was ich bisher:

[A-Z].* .*!!! 

Wie modifiziere ich dies auch angeben, „nicht enthalten,‚_‘“?

Es muss nicht die spezifische Zeichenfolge "_" sein. Wie kann ich sagen, dass keine Zeichenfolge enthalten ist? Zum Beispiel nicht mit "Hund"?

bearbeiten: Ich möchte die Lösung mit PHPs "preg_replace"

bearbeiten kompatibel sein: Beispiele:

Beispiele für "_":

Abc xyz !!! < --- Spiele

Hallo Welt !!! < --- Treffer

Hat _ Leerzeichen Underscore Leerzeichen !!! < --- passt nicht

Beispiele für "Hund":

Was für ein Hund !!! < --- stimmt nicht überein, (enthält "Hund")

Hallo Welt !!! < --- Übereinstimmungen

+4

Hallo, welche Sprache verwenden Sie? Perl Reg.exps? ECMAScript? – Benoit

+0

Können Sie einige Beispiele für gültige/ungültige Strings veröffentlichen? – Kobi

Antwort

2

Der x(?!y) Ausdruck passt x nur, wenn es nicht sofort von y folgt. So scheint dies die Sache zu sein, Sie wollen:

[A-Z](?!%s)(.(?!%s))* (.(?!%s))*!!! 

Wo %s Ihre verboten Zeichenfolge ist.

1

Jede mögliche regex für dieses würde vermutlich viel komplizierter als zwei Regexes sein. Einer wie dein: [A-Z].* .*!!! und der zweite auf übereinstimmende Strings angewendet und überprüft, ob _ enthalten ist.

+0

Leider muss ich den übereinstimmenden Teil der Zeichenfolge "erfassen", also brauche ich eine einzige Regex dafür. – Joshua

0

Beginnen Sie mit beliebigem Kapital; habe eine optionale Zeichenkette von allem außer einem Unterstrich, einem Leerzeichen und dann wieder alles außer dem Unterstrich, gefolgt von drei Ausrufezeichen.

[A-Z][^_]*[ ][^_]*!!! 
+0

Passt nicht zu 'Abc_d ef !!!' – Benoit

+0

Wie würde ich das im Fall des "Hund" -Beispiels in meiner obigen Bearbeitung anwenden? – Joshua

0

Erster Test der Zeichenfolge für jedes Auftreten von „_“, denn das ist ein nicht gewachsen ist. Dann überprüfen Sie, was Sie wollen.

Das würde ich tun, anstatt viel Zeit damit zu verbringen, einen regulären Ausdruck dafür herauszufinden.

Hier ist eine schöne Seite für Ihre Ausdrücke testen: Nregex

bearbeiten: Ich einige mehr auf Ihre Frage zu lesen und sehen, dass meine Antwort nicht wirklich gut war, also hier ist ein weiterer Versuch. Eine Modifikation einer der Ausdrücke oben:

[A-Z](?! _)(\w(?! _))* (\w(?! _))*!!! 
0
[A-Z]([^ ]*(?! _) ?)*!!! 

Edit: ich Ihre Anforderung verpassten für zumindest einen Raum. Die unten regex enthält diese Anforderung:

[A-Z][^ ]* (?!_)((?! _).)*!!! 
0

ich es über grep ‚s -v Option zur Lösung verwendet (wenn ich auf Linux bin und/oder grep verwenden kann).

Suchen Sie also nach etwas, dann überspringen Sie die uninteressanten Teile.

grep something <INPUT> | grep -v uninteresting 

Ohne grep (Fenster verdammen, ohne Admin-Rechte), aber mit Vim:

vim -c "v/i'm searching for this/d" -c "g/and don't need this/d" -c "w checkoutput" <INPUT> 

(Dies öffnet, dann jede Zeile löscht, was nicht, was Sie passt benötigen, dann löscht jede Zeile, was Sie braucht nicht, dann die Ergebnisse als checkoutput speichern. was sollten Sie überprüfen.)

HTH