Вот регулярное выражение, которое отлично работает в большинстве реализаций регулярных выражений:
(?<!filename)\.js$
Это соответствует .js строке, которая заканчивается на .js, за исключением filename.js
Javascript не поддерживает поиск назад с помощью регулярных выражений. Может ли кто-нибудь собрать альтернативное регулярное выражение, которое дает тот же результат и работает в javascript?
Вот некоторые мысли, но нужны вспомогательные функции. Я надеялся добиться этого только с помощью регулярного выражения: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
javascript
regex
Дэниел
источник
источник
(?<=thingy)thingy
для положительного просмотра назад и(?<!thingy)thingy
для отрицательного просмотра назад . Теперь он их поддерживает.Ответы:
^(?!filename).+\.js
работает для меняпротестировано против:
Правильное объяснение этого регулярного выражения можно найти в разделе Регулярное выражение для соответствия строке, не содержащей слова?
Прогнозирование доступно с версии 1.5 javascript и поддерживается всеми основными браузерами.
Обновлено для соответствия filename2.js и 2filename.js, но не filename.js
(^(?!filename\.js$).).+\.js
источник
a.js
2filename.js
, а вот приведенное здесь регулярное выражение соответствует. Было бы более подходящим^(?!.*filename\.js$).*\.js$
. Это означает, что нужно соответствовать любому,*.js
кроме*filename.js
.РЕДАКТИРОВАТЬ: Начиная с ECMAScript 2018, утверждения просмотра назад (даже без ограничений) поддерживаются изначально .
В предыдущих версиях это можно было сделать:
Это явно делает то, что выражение просмотра назад делает неявно: проверяет каждый символ строки, если выражение просмотра назад плюс регулярное выражение после него не соответствует, и только затем разрешает совпадение этого символа.
^ # Start of string (?: # Try to match the following: (?! # First assert that we can't match the following: filename\.js # filename.js $ # and end-of-string ) # End of negative lookahead . # Match any character )* # Repeat as needed \.js # Match .js $ # End of string
Другое редактирование:
Мне больно говорить (особенно с учетом того, что за этот ответ так много проголосовали), что есть гораздо более простой способ достичь этой цели. Нет необходимости проверять просмотр вперед для каждого символа:
работает так же хорошо:
^ # Start of string (?! # Assert that we can't match the following: .* # any string, filename\.js # followed by filename.js $ # and end-of-string ) # End of negative lookahead .* # Match any string \.js # Match .js $ # End of string
источник
2filename.js
. Мое регулярное выражение совпадает в тех же случаях, что и ваше регулярное выражение в примере.^(?!.*filename\.js$).*\.js$
сработает. Пытаюсь подумать о ситуациях, в которых ncgroup все еще может понадобиться ...Предположим, вы хотите найти все,
int
чему не предшествуютunsigned
:С поддержкой отрицательного ретроспективного анализа:
Без поддержки негативного анализа:
((?!unsigned ).{9}|^.{0,8})int
В основном идея состоит в том, чтобы захватить n предшествующих символов и исключить совпадение с отрицательным упреждающим просмотром, но также сопоставить случаи, когда нет предшествующих n символов. (где n - длина просмотра назад).
Итак, рассматриваемое регулярное выражение:
переведет на:
((?!filename).{8}|^.{0,7})\.js$
Возможно, вам придется поиграть с группами захвата, чтобы найти точное место в строке, которое вас интересует, или вы не хотите заменять определенную часть чем-то другим.
источник
(?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne))
to(?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne))
which делает трюк для моих нужд. Просто представьте это как еще один сценарий «реального мира». См. Ссылку((?!unsigned ).{9}|^.{0,8})int
Если вы можете смотреть вперед, но назад, вы можете сначала перевернуть строку, а затем выполнить просмотр вперед. Конечно, нужно будет проделать еще немного работы.
источник
Это эквивалентное решение для ответа Тима Пицкера (см. Также комментарии к тому же ответу):
Это означает, что матч
*.js
кроме*filename.js
.Чтобы найти это решение, вы можете проверить, какие шаблоны исключает отрицательный просмотр назад, а затем исключить именно эти шаблоны с помощью отрицательного просмотра назад.
источник
Ниже приведена альтернатива JavaScript с положительным обзором, показывающая, как записывать фамилии людей, в которых имя «Майкл».
1) Учитывая этот текст:
const exampleText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";
получить массив фамилий людей по имени Майкл. Результат должен быть:
["Jordan","Johnson","Green","Wood"]
2) Решение:
function getMichaelLastName2(text) { return text .match(/(?:Michael )([A-Z][a-z]+)/g) .map(person => person.slice(person.indexOf(' ')+1)); } // or even .map(person => person.slice(8)); // since we know the length of "Michael "
3) Проверить решение
console.log(JSON.stringify( getMichaelLastName(exampleText) )); // ["Jordan","Johnson","Green","Wood"]
Демо здесь: http://codepen.io/PiotrBerebecki/pen/GjwRoo
Вы также можете попробовать это, запустив приведенный ниже фрагмент.
const inputText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?"; function getMichaelLastName(text) { return text .match(/(?:Michael )([A-Z][a-z]+)/g) .map(person => person.slice(8)); } console.log(JSON.stringify( getMichaelLastName(inputText) ));
источник