Рекурсивное регулярное выражение в Perl - PullRequest
0 голосов
/ 12 июля 2011

У меня есть такие строки:

| Released    = {{start-date|June 14, 1972}}
| Released    = {{Start date|1973|03|01|df=y}} 

Я хотел бы заменить все | в {{}} с ^

| Released    = {{start-date^June 14, 1972}}
| Released    = {{Start date^1973^03^01^df=y}} 

Я не могу использовать замену подстроки, потому что есть | символы вне {{}}, которые должны быть оставлены нетронутыми. И поскольку я не знаю точно, сколько частей содержит строка в {{}}, я не могу использовать что-то вроде s/{{(.+?)\|(.+?)}}/{{$1^$2}}/.

Полагаю, мне здесь нужна какая-то рекурсия?

Ответы [ 3 ]

5 голосов
/ 12 июля 2011

Простое решение:

s/\|(?=[^{}\n]*}})/^/g

Еще более простое решение, но, вероятно, оно во многих случаях не работает:

s/(?!^)\|/^/gm

Вот немного более надежное регулярное выражение:

s/(?:\G(?!^)(?:(?>[^|]*?}})(?>.*?{{))*|^(?>.*?{{))(?>[^|]*?(?=}}|\|))\K\|(?=.*?}})/^/gs;

Комментарий:

s/
(?:
  \G(?!^)                       # inside of a {{}} tag
  (?: (?>[^|]*?}}) (?>.*?{{) )* # read till we find a | in another tag if none in current
  |
  ^(?>.*?{{)                    # outside of tag, parse till in
)
(?> [^|]*? (?=}}|\|) )          # eat till a | or end of tag
\K                              # don't include stuff to the left of \K in the match
\|                              # the |
(?=.*?}})                       # just to make sure the tag is closed
/^/gsx;

Вход:

|}}
| Re|eased    = {{start-date|June 14^, {|1972}|x}}
| Released    = {{Start date}|1973|03|01}|df=y|}}
| || {{|}} {{ |

Выход:

|}}
| Re|eased    = {{start-date^June 14^, {^1972}^x}}
| Released    = {{Start date}^1973^03^01}^df=y^}}
| || {{^}} {{ |

Пример: http://ideone.com/fbY2W

3 голосов
/ 12 июля 2011

Возможно, это не самый краткий способ сделать это, но это первый метод работы, который я придумал.

my $new;
for ( split /({{.*?}})/ ) {
    s/\|/^/g if /^{{/;
    $new .= $_;
}
$_ = $new;
2 голосов
/ 12 июля 2011
s{({{.*?}})}
 {my $x = $1;
  $x =~ tr/|/^/;
  $x
 }ge;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...