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

{{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+\}\})

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

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

ОБНОВЛЕНИЕ: я использую PHP, чтобы быть ясным

1
Higeath 3 Янв 2016 в 22:14

2 ответа

Лучший ответ

Я предполагаю, что вы хотите удалить части {{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
Wiktor Stribiżew 3 Янв 2016 в 20:17

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

\{\{[^|]*\|([^|]*)
1
buckley 3 Янв 2016 в 20:35