Вы можете использовать следующее регулярное выражение:
(\{\{m\|[^}]*\|)([^|}]*)(\}\})
и замена:
\1(\2)\3
Ввод:
{{m|gem-pro|*karzijan?||to turn}}
{{m|gem-pro|*karzijan?||abc}}
{{m|gem-pro|*karzijan?||to turn}},{{m|ine-pro|*gers-||to bend, turn}}
{{do nothing}}
#do nothing
Вывод:
{{m|gem-pro|*karzijan?||(to turn)}}
{{m|gem-pro|*karzijan?||(abc)}}
{{m|gem-pro|*karzijan?||(to turn)}},{{m|ine-pro|*gers-||(to bend, turn)}}
{{do nothing}}
#do nothing
Демонстрация: https://regex101.com/r/yoo9KG/2/
Пояснения:
(\{\{m\|[^}]*\|)
будет захватывать строки, начинающиеся с {{m
, за которыми следуют символы от 0 до N, которые не являются }
до достижения |
, последней из которых находится в вашей структуре {{m...|...|..}}
.Ссылка на группу захвата может быть возвращена с помощью \1
([^|}]*)
, которая будет соответствовать последней строке в вашей структуре и сохранит ее во 2-й группе захвата. (\}\})
захватит последние 2 }
и сохранит их в 3-й группе. - Вы используете в качестве замены 3 обратных ссылки и окружаете 2-ю круглыми скобками, чтобы добраться дорезультат.
код Java:
String input = "{{m|gem-pro|*karzijan?||to turn}},{{m|ine-pro|*gers-||to bend, turn}}";
String output = input.replaceAll("(\\{\\{m\\|[^}]*\\|)([^|}]*)(\\}\\})", "$1($2)$3");
System.out.println(output);
вывод:
{{m|gem-pro|*karzijan?||(to turn)}},{{m|ine-pro|*gers-||(to bend, turn)}}