Попытка сопоставить строку A, если строка B найдена где-либо перед ней - PullRequest
0 голосов
/ 02 февраля 2020

Что я пытаюсь сделать, если строка состоит из некоторой подстроки, которая начинается с "!" заключенный в "[" и "]", чтобы отделить эти скобки от остальной части строки через пробел, например "[! foo]" -> "[! foo]", "[! bar]" -> "[! bar]", et c. Поскольку эта подстрока может иметь переменную длину, я решил, что это должно быть сделано с помощью регулярного выражения. Я думал сделать это в два шага - сначала отделить первую скобку, затем отделить вторую скобку.

Первая не сложная; регулярное выражение просто \[!, и поэтому я могу просто сделать str = str.replace(/\[!/g, "[ !"); в Javascript. Это вторая часть, которую я не могу заставить работать.

Потому что теперь мне нужно сопоставить "]", если строковый литерал "[!" находится в любом месте перед ним. Так что простой положительный взгляд назад не совпадает, потому что он только смотрит прямо сзади: (?<=\Q[ !\E)\] не совпадает.

И я до сих пор не понимаю, почему, но я не разрешено делать позитивный взгляд за нефиксированной длиной; (?<=\Q[ !\E.*)\] выдает ошибку Syntax Error: Invalid regular expression: missing / в консоли, а этот отладчик регулярных выражений выдает ошибку шаблона, объясняющую, что "квантификатор внутри взгляда делает его нефиксированной ширины".

Установка не захватившая группа с нефиксированной шириной между обзорным изображением и группой захвата не работает; (?<=\Q[ !\E)(?:.*)\] не совпадает.

Одна вещь, которая не работает, это просто попытка сопоставить "[!" в начале строки, потому что вся эта строка «[! foo]» на самом деле сама подстрока еще большей строки и не находится в начале.

Что я отсутствует

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Используя 2 положительных поисков, вы можете утверждать, что слева находится открывающая квадратная скобка (?<=\[)

Затем сопоставьте любой символ, кроме ], используя класс отрицательных символов ![^[\]]+ с предшествующим восклицательным знаком и подтверждением того, что справа является закрывающая квадратная скобка с использованием (?=])

Обратите внимание, что в Javascript внешний вид пока еще широко не поддерживается.

(?<=\[)![^[\]]+(?=])

В замене используется соответствующая подстрока $&

Regex demo

[
  "[!foo]",
  "[!bar]"
].forEach(s =>
  console.log(s.replace(/(?<=\[)![^[\]]+(?=])/g, " $& "))
)

Или вместо этого вы можете использовать 3 группы захвата:

(\[)(![^\]]+)(\])

В качестве замены используйте

$1 $2 $3

Regex demo

[
  "[!foo]",
  "[!bar]"
].forEach(s =>
  console.log(s.replace(/(\[)(![^\]]+)(\])/g, "$1 $2 $3"))
)
0 голосов
/ 02 февраля 2020

Вы можете использовать это регулярное выражение: \[!([^]]+)\] с этой строкой подстановки [! \1 ].

Объяснение :

Регулярное выражение:

  • \[!: совпадение начинается с [!
  • ([^]]+): захват в группе 1 всех символов, которые не являются]
  • \]: совпадение]

Подстановка: заменить полное совпадение на [! {содержимое группы 1} ].

Regex Demo

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

...