Как я могу инвертировать регулярное выражение в JavaScript?
У меня есть строка A и вы хотите проверить, не является ли другая строка B ее частью. Это очень
простое регулярное выражение, результат которого можно инвертировать впоследствии.
Я мог бы сделать:
/foobar/.test('[email protected]')
и инвертируйте его, следующим образом:
!(/foobar/).test('[email protected]')
Проблема заключается в том, что мне нужно сделать это в пределах регулярного выражения, а не с их результатом. Что-то вроде:
/!foobar/.test('[email protected]')
(который не работает)
Другими словами: регулярное выражение должно проверять отсутствие и возвращать true в этом случае.
Возможно ли это с JavaScript?
Ответы
Ответ 1
Try:
/^(?!.*foobar)/.test('[email protected]')
A (краткое) объяснение:
^ # 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 поддерживает только ожидания, отсутствие look-
Ответ 2
Здесь пример неравенства.
Сначала я изолирую оператор '<', а затем операнды '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.: Я просто добавил пустое пространство в обратном выражении, чтобы получить точное соответствие для операндов.
Ответ 3
Если то, что вы ищете, действительно не сложнее простой строки типа foobar:
if (yourString.indexOf("foobar") === -1) {
// ...
}
http://www.w3schools.com/jsref/jsref_indexOf.asp
Ответ 4
^(?!.*(word1|word2|word3))
будет соответствовать строке, которая не содержит ни одного из word1
, word2
или word3
(и вы можете продлить список на неопределенный срок).
Но это также соответствует нулевым строкам. Для отклонения нулей используйте
^(?!$)(?!.*(word1|word2|word3))