Regex, чтобы найти строку и заменить ее или добавить дополнительные символы в зависимости от условия - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть строка {{m|gem-pro|*karzijan?||to turn}}, когда когда-либо строка начинается с {{m и заканчивается }} Я хочу окружить to turn () строкой в ​​скобках, которая предшествует }}

Строка: {{m|gem-pro|*karzijan?||to turn}}

Обязательная строка: {{m|gem-pro|*karzijan?||(to turn)}}

строка может быть не только to turn, но и любой строкой.

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Вы можете использовать 2 группы захвата с положительным прогнозом:

({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=}})

В Java

String regex = "(\\{\\{m(?:\\|[^\\|]+)*\\|\\|)([^\\}]+)(?=\\}})";

О шаблоне

  • ( Захватгруппа 1
    • {{m Совпадение буквально
    • (?:\|[^\|]+)* Повторить 0+ раз сопоставления | с последующим сопоставлением не |
    • \|\| Совпадение ||
  • ) Закрыть группу 1
  • ( Группа захвата 2
    • [^}]+ Совпадение 1+ раз не}
  • ) Закрыть группу 2
  • (?=}}) Позитивный прогноз, утверждать, что прямо справа есть}}

Демонстрационная модель

При замене используйте 2 группы захвата:

$1($2)

Например, в C #:

string pattern = @"({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=}})";
string input = @"{{m|gem-pro|*karzijan?||to turn}}";
Console.WriteLine(Regex.Replace(input, pattern, @"$1($2)"));
2 голосов
/ 16 апреля 2019

Вы можете попробовать использовать это регулярное выражение:

{{m(.+)\|\|(.+)}}

и этот шаблон замещения:

{{m\1||(\2)}}

Рабочий пример: https://regex101.com/r/3inQ3p/1

1 голос
/ 16 апреля 2019

Вы можете использовать следующее регулярное выражение:

(\{\{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)}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...