Как я могу инвертировать регулярное выражение в 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))