Исключая совпадения в начале или конце строки в регулярном выражении с помощью JavaScript - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь определить регулярное выражение в JavaScript, которое соответствует всем вхождениям, за исключением тех, которые указаны в начале или в конце строки.

Я могу исключить те в начале, но не вконец.Например:

const MULTILINE = `
Lorem ipsum dolor sit amet ANNA
ANNA lorem ipsum dolor sit amet
Lorem ipsum dolor ANNA sit amet
`

MULTILINE.match(/ANNA\w+/gm)
// output: ["ANNA_END", "ANNA_BEGIN", "ANNA_MIDDLE"] ok

MULTILINE.match(/(?!^)ANNA\w+/gm))
// output: ["ANNA_END", "ANNA_MIDDLE"] ok

MULTILINE.match(/ANNA\w+(?!$)/gm))
// output: ["ANNA_EN", "ANNA_BEGIN", "ANNA_MIDDLE"] fail
// expected: ["ANNA_BEGIN", "ANNA_MIDDLE"]

Как видно, он правильно идентифицирует мою последнюю строку, но извлекает последний символ (как если бы $ заменялось другим выражением \ d).

У меня естьпрочитайте много документации и опробовали несколько вариантов, таких как MULTILINE.match(/ANNA\w+(?!ANNA\w+$)/gm)), но безуспешно.

Любая помощь здесь?:)

1 Ответ

1 голос
/ 16 марта 2019

ANN_END возвращает ANN_EN совпадение, потому что (?!$) в случае отказа при возврате двигателя возвращает двигатель, а в качестве шаблона прямо перед (?!$) - \w+, квантифицированный шаблон +, функция обратного отслеживания позволяетсовпадение до конца строки.Посмотрите это демо и обратите внимание на красную стрелку, которая показывает возврат на шаге 9:

enter image description here

Чтобы запретить это частичное совпадение слов, вы можете добавить границу слова, \b, или другой прогноз, (?!\w).

Полное решение для сопоставления ANNA\w+ не в начале / конце строки будет выглядеть как

/(?!^)\bANNA\w+\b(?!$)/gm

См. Демонстрационную версию regex .

Подробности

  • (?!^) - отрицательный прогноз, который не дает совпадения, если индекс регулярного выражения находится в начале строки
  • \b -граница слова
  • ANNA - подстрока
  • \w+ - один или несколько символов слова
  • \b - граница слова
  • (?!$) - отрицательный прогноз, который не соответствует совпадению, если индекс регулярного выражения находится в конце строки.

JS demo:

const MULTILINE = `Lorem ipsum dolor sit amet ANNA_END
ANNA_BEGIN lorem ipsum dolor sit amet
Lorem ipsum dolor ANNA_MIDDLE sit amet`;
console.log(MULTILINE.match(/(?!^)\bANNA\w+\b(?!$)/gm));
...