регулярное выражение для удаления подстрок, разделенных соответствующими двойными скобками - PullRequest
1 голос
/ 22 февраля 2010

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

adfsdf dsf  {{sadfsdfadf {{Infobox}} musical}} jljlk }}

Я хочу исключить все {{..}} подстроки. Я пытался

\{\{.*\}\}

, который исключает {{sadfsdfadf{{Infobox}} musical}} jljlk }}, но я хочу удалить {{sadfsdfadf {{Infobox}} musical}}, проверяя }} ближе к началу подстроки.

Как я могу это сделать?

Ответы [ 4 ]

3 голосов
/ 22 февраля 2010

Используйте ленивый квантификатор:

\{\{.*?\}\}
1 голос
/ 23 февраля 2010

Вот краткий пример использования последней версии 1.9.x Ruby. Если вы запустите релиз 1.8.x, вам понадобится камень oniguruma. Это не учитывает экранирование \{\{, но обрабатывает одиночные { и }, которые, я полагаю, вы захотите игнорировать.

#!/usr/bin/evn ruby
# Old 1.8.x versions of Ruby you'll need the gem.
# require 'oniguruma'
require 'pp'

squiggly = %r/
  (
    (?<squiggly>         # squiggly named group
      \{\{               # start {{
        (?:              # non matching group
          [^{}]          # anything not { or }
          | \{[^{]       # any { not followed by {
          | \}[^}]       # any } not followed by }
          | \g<squiggly> # nested squiggly
        )*               # zero or more times
      \}\}               # end }}
    )                    # end of squiggly
  )/x

string = 'adfsdf dsf  {{sadfsdfadf {{Infobox}} musical}} jljlk }}'
pp squiggly.match(string)[:squiggly] #=> {{sadfsdfadf {{Infobox}} musical}}
1 голос
/ 23 февраля 2010

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

Тем не менее, в Perl есть некоторые возможности для рекурсивных регулярных выражений; это позволит вам делать то, что вы хотите. Я не знаю, способен ли Ruby сделать то же самое.

1 голос
/ 22 февраля 2010

Вот довольно ненадежное выражение \{\{[a-zA-Z\s]*\}\}, которое будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...