Regex ловит странную строку с {{}} знаками

Пример строки

{{ai|Perseverance|Garen}} is no longer removed by combat dehancing effects such as {{ai|Blood Scent|Warwick}}.

Я хочу поймать {{ai|Perseverance|Garen}} из этого {{ai| |Garen}} и сохранить среднюю часть с {{ai| |Warwick}}

Вот что я придумал:

(\{\{ai\|)\w+(\|\w+\}\})

он довольно близок к первому, но с Perserverance я мог бы дважды сделать регулярное выражение, чтобы избавиться от первого {{ai| and then |Garen}} с помощью (\{\{ai\|) сначала, а потом (\|\w+\}\}),

Есть ли способ сделать это в одном регулярном выражении?

ОБНОВЛЕНИЕ: я использую PHP только для ясности

1

Решение

Я полагаю, вы хотите удалить {{some| а также |thing}} части и держите то, что посередине.

Ты можешь использовать

{{[^|]*\|([^|]*)\|[^|]*}}

а также $1 в качестве шаблона замены.

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

  • {{ — два буквальных { символы
  • [^|]*\| — ноль или более символов, кроме |[^|]*) с последующим буквальным |
  • ([^|]*) — Группа 1, которая соответствует нулю или более символов, кроме |
  • \| — буквальный |
  • [^|]* — опять ноль или более символов, кроме |
  • }} — закрытие }}

Увидеть демонстрация

Обратите внимание, что будет работать, когда есть 3 |части внутри {{/}},

В PHP вы можете использовать следующий код:

$re = '~{{[^|]*\|([^|]*)\|[^|]*}}~';
$str = "{{ai|Perseverance|Garen}} is no longer removed by combat dehancing effects such as {{ai|Blood Scent|Warwick}}";
$result = preg_replace($re, '\1', $str);
echo $result;
// => Perseverance is no longer removed by combat dehancing effects such as Blood Scent
1

Другие решения

Ваш матч в группе 1 следующего регулярного выражения

\{\{[^|]*\|([^|]*)
1

По вопросам рекламы [email protected]