Регулярное выражение: сопоставить строку вне пары строк - PullRequest
2 голосов
/ 23 июня 2019

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

Существует по крайней мере один пост по этому поводу, однако мне не ясно, как это работает, Текст соответствия регулярному выражению вне скобок

Например, примерная строка будет иметь вид:

<= \( <= \) <= \( <= \) <= \( <= \)

В моем текущем регулярном выражении использовались lookbehind и lookaheadхотя это не работает:

(?<=(\\\)))<=(?=(\\\())

Я хочу сопоставить <=, которые не находятся между <code>\( \), поэтому я могу заменить его на & le, чтобы получить:

&le \( <= \) &le \( <= \) &le \( <= \)

Обратите внимание, что \( \) может существовать или не существовать.

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Для этого вам понадобится функция заменителя. Совпадение \(, за которым следует \), ИЛИ совпадение <=. Если круглые скобки были сопоставлены, замените все совпадения (чтобы сохранить то, что находится внутри скобок без изменений), в противном случае замените совпадение <= на &le:

const input = String.raw`<= \( <= \) <= \( <= \) <= \( <= \)`;
const output = input.replace(
  /\\(.*?\\)|<=/g,
  match => match === '<=' ? '&le' : match
);
console.log(output);

\\(.*?\\)|<= означает совпадение либо:

  • \\( - Буквальный обратный слеш, за которым следует (
  • .*? - любые символы, пока не встретятся
  • \\) - Буквальный обратный слеш, за которым следует )

ИЛИ соответствует

  • <= - простые символы <=

(если бы двигатель JS был более продвинутым, это было бы возможно без функции замены, например, \\(.*?\\)(*SKIP)(*FAIL)|<=, но JS не поддерживает это)

Будьте осторожны при использовании lookbehind в Javascript - это поддерживают только очень новые браузеры. Многие старые браузеры не могут понять это и будут выдавать ошибки. Лучше по возможности избегать использования видимости, по крайней мере, в обозримом будущем, если вы хотите, чтобы ваш сайт работал для максимально возможного числа посетителей.

0 голосов
/ 23 июня 2019

Вы можете использовать (?<!([^\\]*\\\())(<=)(?!([^\\]*\\\))), он использует отрицательный взгляд и отрицательный взгляд, чтобы убедиться, что за ним нет \( и \) перед ним.

Отрицательный взгляд/ взгляд позади - это то же самое, что и позитивный взгляд назад, за исключением того, что он проверяет, существует ли эта группа, вместо проверки, существует ли он.

Regexr Link

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...