Нечетный запрос RegEx для Javascript - PullRequest
1 голос
/ 14 июля 2020

У меня проблемы с определенной строкой замены RegEx для последующего использования в Javascript.

У нас довольно много текста, который был сохранен в довольно странном формате, который нам не разрешено исправить. Но нам действительно нужно найти внутри него все строки «сетевого пути», следуя этим правилам:

A. Матчи всегда начинаются с двух обратных косых черт. Б. Соответствующие символы должны прекратиться, как только он встретит первое вхождение любого из них:

  1. A <символ </li>
  2. пробел
  3. перевод строки
  4. Возврат каретки
  5. Символ &
  6. Литеральная строка «\ r» или «\ n» (но только если она встречается в конце строки)

У нас «почти» он работает с /\\\\[^ &<\s]*/gi, как показано на этой странице тестера RegEx: https://regex101.com/r/T4cDOL/5

Даже если мы заставим его работать, RegEx должен даже больше "побег сбежал", прежде чем вставлять наш код Javascript, но это тоже не работает должным образом.

1 Ответ

3 голосов
/ 14 июля 2020

Из вашего примера кажется, что у вас буквально есть backsla sh, за которым следует n и backsla sh, за которым следует r (в отличие от новой строки или возврата каретки), что означает, что вы можете 'не использовать только инвертированный символьный класс (поскольку вам нужно обрабатывать последовательность из двух символов). Я бы использовал положительный взгляд вперед, чтобы знать, где остановиться, поэтому я могу использовать чередование для этой части.

Вы не сказали, какие части этих строк должны совпадать, поэтому мне пришлось угадать немного, но вот мое лучшее предположение (с полезным вводом от Niet the Dark Absol ):

const rex = /\\\\.*?(?=[ &<\r\n]|\\[rn](?:$| ))/gmi;

Это говорит:

  • Соответствие начинается с \\
  • Взять все, что было до опережения (не жадно)
  • Опережающая: чередование:
    • пробел, &, <, возврат каретки ( \r, символ 13) или новую строку (\n, символ 10); или
    • Backsla sh, за которым следует r или n , если либо в конце строки, либо после пробела (поэтому мы получить \nancy, но не \n после него).

Обновленное регулярное выражение x101

Возможно, вы захотите получить больше символов, чем просто пробел после \r / \n. Если да, сделайте его символьным классом (и / или используйте \s для «пробела», если это применимо):

const rex = /\\\\.*?(?=[ &<\r\n]|\\[rn](?:$|[ others]))/gmi;
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^
...