регулярний вираз javascript, який не відповідає слову


87

Як використовувати регулярний вираз JavaScript для перевірки рядка, який не відповідає певним словам?

Наприклад, я хочу функцію, яка при передачі рядка, що містить abcабо def, повертає false.

'abcd' -> false

'cdef' -> false

'bcd' -> true

РЕДАГУВАТИ

Бажано, я хочу регулярний вираз, такий простий, як щось на зразок [^ abc], але він не дає очікуваного результату, оскільки мені потрібні послідовні літери.

напр. я хочуmyregex

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

Заява myregex.test('bcd')оцінюється до true.

Відповіді:


124

Це те, що ви шукаєте:

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

пояснення тут: Регулярний вираз, який відповідає рядку, що не містить слова?


1
Це відповідь, яку я очікую! Дякую. Мені потрібен регулярний вираз, а не функція. Моє запитання було відредаговано, і відповіді з’явились, щоб відповісти на нову версію мого запитання. Ось чому я використав частину "EDIT", щоб уникнути плутанини.
bxx

2
Чи є відповідь, яка не відповідає цілому слову? Ваші приклади "abc", "babc" і "abcd" все не вдаються, і де як "xyz" проходить. Мені потрібно "abc", щоб провалити, але "abcd" пройти. Видалення .та *, здається, не працює,
gman

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

1
Чому ви захоплюєте своїм регулярним виразом?
Неміцний

Гарна думка! Думаю, я думав, що якщо я не захоплю, це може означати ab (c | d) ef.
Петро Іванов

1
Можливо, краще використати /abc|def/g.test(s)це повернення логічного значення в цьому випадку;)
538ROMEO

5

Ось чисте рішення:

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/)тут, мабуть, більш ефективний
SpliFF

Або ..return !string.match(...
McKayla

1
Ще одна гарна порада ... ви, хлопці, повинні розмістити власні відповіді :)
Неміцний


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.