Как инвертировать регулярное выражение в JavaScript?
у меня есть строка A и я хочу проверить, не является ли другая строка B ее частью. Это очень простое регулярное выражение, результат которого может быть инвертирован.
я мог бы сделать:
/foobar/.test('foobar@bar.de')
и переверните его потом, вот так:
!(/foobar/).test('foobar@bar.de')
проблема у меня есть, что мне нужно сделать это в регулярном выражении, а не с их результатом. Что-то вроде:
/!foobar/.test('foobar@bar.de')
(который не работает)
другими словами: регулярное выражение следует проверить на несуществование и вернуть true в этом случае.
возможно ли это с помощью JavaScript?
4 ответов
попробуй:
/^(?!.*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
(и вы можете продлить список до бесконечности).
Но это также соответствует нулевым строкам. Для отклонения нулей используйте
^(?!$)(?!.*(word1|word2|word3))
вот пример неравенства. Сначала я изолирую оператор"
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) {
// ...
}