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

1

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

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

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

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

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

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

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

UPDATE: я использую PHP только для того, чтобы быть понятным

  • 2
    Какой язык / платформу вы используете?
Теги:
pattern-matching
text-extraction

2 ответа

1
Лучший ответ

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

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

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

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

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

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

См. Демонстрацию

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

В 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
  • 0
    это в значительной степени идеально, это результат, который я ожидал бы: «Упорство больше не удаляется с помощью боевых эффектов замедления, таких как Blood Scent», как я могу получить тот же результат с PHP
  • 0
    Вы можете использовать его с preg_replace : preg_replace('~{{[^|]*\|([^|]*)\|[^|]*}}~', '\1', $str)
1

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

\{\{[^|]*\|([^|]*)
  • 0
    Возможно, я делаю что-то не так, но я попробовал ваше регулярное выражение с regexr.com, и все, что я получил, это {{ai | Blood Scent
  • 0
    Это потому, что желаемый текст соответствует группе 1. Вы знаете концепцию групп захвата? Если вы наведите курсор мыши на матч в regexr, вы увидите захват группы 1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню