regulärer Javascript-Ausdruck, der keinem Wort entspricht


85

Wie überprüfe ich mit einem regulären Javascript-Ausdruck eine Zeichenfolge, die nicht mit bestimmten Wörtern übereinstimmt?

Zum Beispiel möchte ich eine Funktion, die, wenn eine Zeichenfolge übergeben wird, die entweder abcoder enthält def, false zurückgibt.

'abcd' -> false

'cdef' -> false

'bcd' -> wahr

BEARBEITEN

Vorzugsweise möchte ich einen regulären Ausdruck, der so einfach wie [^ abc] ist, aber nicht das erwartete Ergebnis liefert, da ich aufeinanderfolgende Buchstaben benötige.

z.B. Ich willmyregex

if ( myregex.test('bcd') ) alert('the string does not contain abc or def');

Die Aussage myregex.test('bcd')wird ausgewertet true.

Antworten:


119

Das suchen Sie:

^((?!(abc|def)).)*$

Die Erklärung ist hier: Regulärer Ausdruck für eine Zeile, die kein Wort enthält?


1
Das ist die Antwort, die ich erwarte! Vielen Dank. Ich brauche eher einen regulären Ausdruck als eine Funktion. Meine Frage wurde bearbeitet und Antworten kamen, um die neue Version meiner Frage zu beantworten. Aus diesem Grund habe ich einen "EDIT" -Teil verwendet, um Verwirrung zu vermeiden.
bxx

2
Gibt es eine Antwort, die nicht mit einem ganzen Wort übereinstimmt? Ihr Beispiel "abc", "babc" und "abcd" schlagen alle fehl und wo als "xyz" vergeht. Ich brauche "abc", um zu scheitern, aber "abcd", um zu bestehen. Entfernen der .und *scheinen nicht zu funktionieren
gman

18
if (!s.match(/abc|def/g)) {
    alert("match");
}
else {
    alert("no match");
}

1
Warum erfassen Sie in Ihrer Regex?
Flimzy

Guter Punkt! Ich denke, ich dachte, wenn ich nicht fange, könnte das ab (c | d) ef bedeuten.
Petar Ivanov

1
Es ist vielleicht besser, /abc|def/g.test(s)in diesem Fall einen Booleschen
Wert zurückzugeben

5

Hier ist eine saubere Lösung:

function test(str){
    //Note: should be /(abc)|(def)/i if you want it case insensitive
    var pattern = /(abc)|(def)/;
    return !str.match(pattern);
}

1
function test(string) {
    return ! string.match(/abc|def/);
}

1
string.match(/abc|def/)ist hier wahrscheinlich effizienter
SpliFF

Oder ..return !string.match(...
McKayla

1
Ein weiterer guter Vorschlag ... ihr
solltet

0
function doesNotContainAbcOrDef(x) {
    return (x.match('abc') || x.match('def')) === null;
}

0

Dies kann auf zwei Arten erfolgen:

if (str.match(/abc|def/)) {
                       ...
                    }


if (/abc|def/.test(str)) {
                        ....
                    } 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.