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

StackOverflow https://stackoverflow.com/questions/1538512

  •  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) {
  // ...
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top