Определение регулярного выражения JavaScript, которое соответствует чему угодно, кроме определенной строки


Хорошо, я чувствую себя довольно толстым прямо сейчас. В принципе, я хочу определить регулярное выражение JavaScript, которое будет соответствовать чему угодно , кроме точно определенной строки. Итак, скажем, у меня есть строка

"dog"

Или

"cat"

Мне нужно отдельное регулярное выражение, которое будет соответствовать строке

"dogsled"

Или строка

"cattle"
Только не "собака" и не "кошка" сама по себе. Я пробовал это, что в основном говорит: игнорируйте все, что начинается с "кошки" или " собаки", а это не совсем то, что мне нужно...
var pattern= /^(?!dog|cat).+/

pattern.test("cat") // false, as expected
pattern.test("dog") // false, as expected
pattern.test("bananananana") // true
pattern.test("dogsled") // false, but the regexp I want would return true

Это должно быть просто.... Спасибо!

Edit Просто чтобы уточнить, я не хочу делать никакого отрицания возвращаемых значений, чтобы получить желаемый результат-регулярное выражение должно возвращать false для "собаки" и true для " собачьей упряжки "или false для" кошки "и true для"скота"

3 10

3 ответа:

Я предпочла бы просто отрицая матч как отмечается в ответ Линуса Клин по. Тем не менее, если вы абсолютно должны делать все это в регулярном выражении (или для опыта обучения или что-то еще) , то я думаю, что следующее должно работать:

^((dog|cat(?!$)).+|(?!dog|cat).+)$

Это использует два отрицательных lookaheads в чередовании. Первый говорит: "сопоставьте cat или dog, если за ним не следует конец строкового символа ($), а затем что-нибудь еще". Это соответствует dogsled и cats и тому подобному природа.

Вторая половина чередования гласит: "убедитесь, что за началом строки (^) не следует dog или cat (поэтому она не начинается ни с того, ни с другого), а затем сопоставьте что-нибудь". Это дает вам любое слово, которое не начинается с cat или dog (например, banana).

Вот пример на regexpal .

Я, кажется, припоминаю отрицательные утверждения look-ahead ((?! ... )), которые не полностью поддерживаются во всех интерпретаторах Javascript. Простого отрицания результата регулярного выражения должно быть достаточно, не так ли?

var pattern = /^cat|dog$/;

!pattern.test("cat");           // => false
!pattern.test("dog");           // => false
!pattern.test("bananananana");  // => true
!pattern.test("dogsled");       // => true

Я думаю, что это должно сделать трюк:

/^(dog|cat)?.+/