Определение регулярного выражения 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 ответа:
Я предпочла бы просто отрицая матч как отмечается в ответ Линуса Клин по. Тем не менее, если вы абсолютно должны делать все это в регулярном выражении (или для опыта обучения или что-то еще) , то я думаю, что следующее должно работать:
^((dog|cat(?!$)).+|(?!dog|cat).+)$
Это использует два отрицательных lookaheads в чередовании. Первый говорит: "сопоставьте
Вторая половина чередования гласит: "убедитесь, что за началом строки (cat
илиdog
, если за ним не следует конец строкового символа ($
), а затем что-нибудь еще". Это соответствуетdogsled
иcats
и тому подобному природа.^
) не следуетdog
илиcat
(поэтому она не начинается ни с того, ни с другого), а затем сопоставьте что-нибудь". Это дает вам любое слово, которое не начинается сcat
илиdog
(например,banana
).
Я, кажется, припоминаю отрицательные утверждения look-ahead (
(?! ... )
), которые не полностью поддерживаются во всех интерпретаторах Javascript. Простого отрицания результата регулярного выражения должно быть достаточно, не так ли?var pattern = /^cat|dog$/; !pattern.test("cat"); // => false !pattern.test("dog"); // => false !pattern.test("bananananana"); // => true !pattern.test("dogsled"); // => true