Regulärer Ausdruck, der keine bestimmte Zeichenfolge enthält

Ich habe so etwas

aabbabcaabda

für die Auswahl der minimalen Gruppe, die von einem eingewickelt wird, habe ich dieses /a([^a]*)a/ was gut funktioniert

Aber ich habe Probleme mit Gruppen, die von aa umschlossen sind , wo ich etwas wie /aa([^aa]*)aa/ brauchen würde, was nicht funktioniert, und ich kann das erste nicht wie /aa([^a]*)aa/ , weil es beim ersten Vorkommen von a enden würde, was ich nicht will.

Allgemein, gibt es irgendeinen Weg, wie man sagt String nicht auf die gleiche Weise enthält , wie ich sagen kann, enthält kein Zeichen mit [^a] ?

Einfach gesagt, ich brauche aa gefolgt von einem beliebigen Zeichen außer Sequenz aa und endet dann mit aa

Solutions Collecting From Web of "Regulärer Ausdruck, der keine bestimmte Zeichenfolge enthält"

Im Allgemeinen ist es ein Problem, einen regulären Ausdruck zu schreiben, der keine bestimmte Zeichenfolge enthält. Wir mussten dies für Berechnungsmodelle tun – Sie nehmen ein NFA, das leicht zu definieren ist, und reduzieren es dann auf einen regulären Ausdruck. Der Ausdruck für Dinge, die nicht “Katze” enthalten, war etwa 80 Zeichen lang.

Edit: Ich bin gerade fertig und ja, es ist:

 aa([^a] | a[^a])aa 

Hier ist ein sehr kurzes Tutorial. Ich habe schon einige tolle gefunden, aber ich kann sie nicht mehr sehen.

Durch die Macht von Google habe ich einen Blogpost von 2007 gefunden, der die folgende Regex enthält, die mit einer Zeichenfolge übereinstimmt, die keine bestimmte Teilzeichenfolge enthält:

 ^((?!my string).)*$ 

Es funktioniert wie folgt: Es sucht nach null oder mehr (*) Zeichen (.), Die nicht beginnen (?! – negative Lookahead) Ihre Zeichenfolge und es besagt, dass die gesamte Zeichenfolge aus solchen Zeichen bestehen muss (mithilfe der ^ und $ Anker). Oder um es anders auszudrücken:

Die gesamte Zeichenfolge muss aus Zeichen bestehen, die nicht mit einer gegebenen Zeichenfolge beginnen, was bedeutet, dass die Zeichenfolge die angegebene Teilzeichenfolge nicht enthält.

Sie brauchen nur einen widerwilligen Quantor:

 regex: /aa.*?aa/ aabbabcaabda => aabbabcaa aaaaaabda => aaaa aabbabcaabda => aabbabcaa aababaaaabdaa => aababaa, aabdaa 

Sie könnten auch negative Lookahead verwenden, aber in diesem Fall ist es nur eine ausführlichere Möglichkeit, das gleiche zu erreichen. Außerdem ist es ein wenig komplizierter als gpojd es geschafft hat. Der Lookahead muss an jeder Position angewendet werden, bevor der Punkt das nächste Zeichen konsumieren darf.

 /aa(?:(?!aa).)*aa/ 

Was den von Claudiu und finnw vorgeschlagenen Ansatz anbetrifft, wird es in Ordnung funktionieren, wenn der Sentinel-String nur zwei Zeichen lang ist, aber (wie Claudiu bestätigte) für längere Strings zu unhandlich ist.

 /aa([^a]|a[^a])*aa/ 

Ich bin mir nicht sicher, ob es sich um ein Standard-Konstrukt handelt, aber ich denke, man sollte sich “negatives Lookahead” anschauen (was schreibt: “?!”, Ohne die Anführungszeichen). Es ist viel einfacher als alle Antworten in diesem Thread, einschließlich der akzeptierten.

Beispiel: Regex: “^ (?! 123) [0-9] * \ w” Zeichnet jede Zeichenfolge beginnend mit Ziffern gefolgt von Buchstaben auf, UNBEGRENZT, wenn “diese Ziffern” 123 sind.

http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs (Microsoft-Seite, aber ziemlich umfassend) für Lookahead / Lookbehind

PS: Es funktioniert gut für mich (.Net). Aber wenn ich etwas falsch mache, lass es uns wissen. Ich finde dieses Konstrukt sehr einfach und effektiv, also bin ich überrascht von der akzeptierten Antwort.

Ich den folgenden Code, den ich ersetzen musste, fügen Sie einen GET-Parameter zu allen Verweisen auf JS-Dateien außer einem.

     sendRequest('/application/srvc/EXCEPTION.js', handleChallengeResponse, null); sendRequest('/application/srvc/EXCEPTION.js",handleChallengeResponse, null); 

Dies ist der verwendete Matcher:

 (?< !EXCEPTION)(\.js) 

Was dies tut, ist, nach allen Vorkommen von ".js" zu suchen, und wenn ihnen die "EXCEPTION" -Strange vorangeht, vercasting Sie dieses Ergebnis aus dem Ergebnis-Array. Das nennt man negativen Lookbehind. Da ich einen Tag damit verbrachte, herauszufinden, wie ich das machen sollte, dachte ich, ich sollte teilen.

 ".*[^(\\.inc)]\\.ftl$" 

In Java wird dies alle Dateien finden, die auf “.ftl” enden, aber nicht auf “.inc.ftl” enden, was genau das ist, was ich wollte.