Вот регулярное выражение, которое отлично работает в большинстве реализаций регулярных выражений:

(?<!filename).js$

Javascript не имеет регулярных выражений. Кто-нибудь может собрать альтернативное регулярное выражение, которое достигает того же результата и работает в JavaScript?

Вот некоторые мысли, но нужны вспомогательные функции. Я надеялся достичь этого просто с помощью регулярного выражения:

Вот некоторые мысли, но нужны вспомогательные функции. Я надеялся достичь этого только с помощью регулярного выражения: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

^(?!filename). .js работает для меня

, проверено на соответствие:

  • test.js match
  • blabla.js match
  • filename.js no match

Правильное объяснение этому регулярному выражению можно найти в Регулярном выражении для соответствия строке, не содержащей слова?

Предварительный просмотр доступен начиная с версии 1.5 javascript и поддерживается всеми основными браузерами

ОБНОВЛЕНО для соответствия filename2.js и 2filename.js, но не filename.js

(^(?!filename.js$).). .js

РЕДАКТИРОВАТЬ: из ECMAScript 2018 и далее утверждения lookbehind (даже неограниченные) поддерживаются нативно Глядя на вывод

В предыдущих версиях вы можете сделать это:

^(?:(?!filename.js$).)*.js$

Это явно делает то, что выражение lookbehind делает неявно: проверяет каждый символ строки, если выражение lookbehind плюс регулярное выражение после того, как оно не будет совпадать, и только тогда позволяет этому персонажу совпадать.

^                 # 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

Другая редакция:

Мне больно говорить (особенно с учетом того, что за этот ответ так много проголосовали), что есть гораздо более простой способ достичь этой цели. Нет необходимости проверять просмотр каждого символа:

^(?!.*filename.js$).*.js$

работает так же хорошо:

^                 # 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

Предположим, вы хотите найти все int, которым не предшествует unsigned:

, с поддержкой отрицательного просмотра:

(?<!unsigned )int

Без поддержки отрицательного просмотра:

((?!unsigned ).{9}|^.{0,8})int

В основном идея состоит в том, чтобы захватить n предшествующих символов и исключить совпадение с отрицательным прогнозом, но также сопоставить случаи, когда нет предшествующих n символов. (где n — длина оглядки назад).

Таким образом, рассматриваемое регулярное выражение:

(?<!filename).js$

будет переводиться в:

((?!filename).{8}|^.{0,7}).js$

Возможно, вам придется поиграть с группами захвата, чтобы найти точное место строки, которая вас интересует, или вы не хотите заменять определенную часть чем-то другим.

Если вы можете смотреть вперед, но назад, вы можете сначала перевернуть строку, а затем сделать заглядывание вперед. Конечно, нужно проделать еще кое-что.

Это эквивалентное решение ответа Тима Пицкера (см. Также комментарии того же ответа):

^(?!.*filename.js$).*.js$

Это означает, что соответствует *.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?";

получить массив фамилий людей по имени Michael. Результат должен быть: ["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)    ));