Как я могу инвертировать регулярное выражение в JavaScript?

У меня есть строка A, и я хочу проверить, не является ли другая строка B ее частью. Это очень простое регулярное выражение, результат которого впоследствии можно инвертировать.

Я мог бы сделать:

/foobar/.test('[email protected]')

и инвертировать его потом, вот так:

!(/foobar/).test('[email protected]') 

У меня проблема в том, что мне нужно сделать это в регулярном выражении, а не с их результатом. Что-то типа:

/!foobar/.test('[email protected]')

(что не работает)

Другими словами: регулярное выражение должно проверять на несуществование и в этом случае возвращать true.

Возможно ли это с помощью JavaScript?


person acme    schedule 08.10.2009    source источник


Ответы (4)


Пытаться:

/^(?!.*foobar)/.test('[email protected]')

(Короткое) объяснение:

^          # 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 поддерживает только просмотр вперед, а не просмотр назад!

person Bart Kiers    schedule 08.10.2009
comment
Красиво - не могли бы вы объяснить это? - person jantimon; 08.10.2009
comment
Спасибо, я никогда не видел?! до. Отличный ответ - person jantimon; 08.10.2009
comment
Отлично, это было именно то, что мне было нужно. Никогда раньше не пробовал отрицательный просмотр в JavaScript. Большое спасибо! - person acme; 09.10.2009
comment
+1 Я искал ваш пост с регулярным выражением, чтобы проголосовать за него - кажется, это подходящий, поскольку он касается осмотра. Спасибо еще раз. - person Amarghosh; 05.11.2009
comment
Я бы хотел, чтобы JavaScript поддерживал Perl-подобные комментарии регулярных выражений каждый раз, когда я пишу регулярное выражение в JS. - person wprl; 13.02.2014

^(?!.*(word1|word2|word3))

будет соответствовать строке, которая не содержит ни одного из word1, word2 или word3 (и вы можете бесконечно расширять список). Но это также соответствует нулевым строкам. Чтобы отклонить нули, используйте

^(?!$)(?!.*(word1|word2|word3))  
person thing241    schedule 07.12.2014

Вот пример неравенства. Сначала я изолирую оператор '‹', позже операнды '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.: Я просто добавил пробел в обратном выражении, чтобы получить точное совпадение для операндов.

person Sandro Rosa    schedule 26.10.2015

Если то, что вы ищете, на самом деле не сложнее простой строки типа «foobar»:

if (yourString.indexOf("foobar") === -1) {
  // ...
}

http://www.w3schools.com/jsref/jsref_indexOf.asp

person Brian Kelly    schedule 08.10.2009
comment
Спасибо, но это должно быть регулярное выражение, я просто немного упростил пример. - person acme; 09.10.2009
comment
или yourString.includes(foobar) :) - person rogerdpack; 28.10.2016