Как я могу инвертировать регулярное выражение в JavaScript?
-
20-09-2019 - |
Вопрос
У меня есть строка A, и я хочу проверить, не является ли другая строка B ее частью.Это очень простое регулярное выражение, результат которого впоследствии может быть инвертирован.
Я мог бы сделать:
/foobar/.test('foobar@bar.de')
а потом переверните его, вот так:
!(/foobar/).test('foobar@bar.de')
Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно сделать это в рамках регулярного выражения, а не с их результатом.Что - то вроде:
/!foobar/.test('foobar@bar.de')
(который не работает)
Другими словами:регулярное выражение должно проверять на несуществование и возвращать true в этом случае.
Возможно ли это с помощью JavaScript?
Решение
Попробуй:
/^(?!.*foobar)/.test('foobar@bar.de')
(Краткое) объяснение:
^ # start of the string
(?! # start negative look-ahead
.* # zero or more characters of any kind (except line terminators)
foobar # foobar
) # end negative look-ahead
Итак, на простом английском языке это регулярное выражение будет выглядеть с начала строки, если строку 'foobar' можно "увидеть".Если это можно "увидеть", то есть НЕТ* совпадение.
* нет совпадения, потому что это отрицательный смотри-вперед!
Подробнее об этом перспективном материале: http://www.regular-expressions.info/lookaround.html Но обратите внимание, что JavaScript поддерживает только внешний вид, никакого внешнего вида-сзади!
Другие советы
^(?!.*(word1|word2|word3))
будет соответствовать строке, которая не содержит ни одного из word1
, word2
, или word3
(и вы можете расширять список бесконечно).Но это также соответствует нулевым строкам.Чтобы отклонить значения null, используйте
^(?!$)(?!.*(word1|word2|word3))
Вот пример неравенства.Сначала я изолирую оператора '<', позже операнды 'a' и 'b'.По сути, я беру прямое выражение, заключаю его в правые круглые скобки, инвертирую последнее на '^' и, наконец, вставляю результирующее выражение в квадратные скобки ', потому что '^' в начале было бы интерпретировано по-другому.
var _str = "a < b" ;
var _op = /</g ;
var _no_op = /[^(<|\ )]/g ;
console.log( _str, _str.match( _op ) ); // get '<'
console.log( _str, _str.match( _no_op ) ); // get 'a', 'b'
P.s.:Я просто добавил пустое место в обратное выражение, чтобы получить точное соответствие для операндов.
Если то, что вы ищете, действительно не сложнее простой строки типа "foobar",:
if (yourString.indexOf("foobar") === -1) {
// ...
}