Регулярное выражение для захвата символа между группой, но игнорирование символов во вложенной группе - PullRequest
0 голосов
/ 08 апреля 2010

Это сделано для создания чего-то похожего на «шаблоны» в MediaWiki с PHP для обеспечения работы параметров между вложенными шаблонами.

Возможно с помощью регулярного выражения захватывать все вхождения символа между фигурными скобками, но игнорируяего появления, если оно встречается во вложенной группе фигурных скобок?

| {{ | {{ | }} | | }} |

выделено:

| {{ *|* {{ | }} *|* *|* }} |

Ответы [ 2 ]

0 голосов
/ 08 апреля 2010

Нет, вы должны написать грамматику без контекста (или рекурсивные регулярные выражения Perl) для ее анализа.Чем заменяются игнорируемые вложенные шаблоны?

Парсер будет выглядеть так в псевдокоде:

input = "| {{ | {{ | }} | | }} |", pointer = 0;
char = '', results = [];

read_next_char() {
  return input[++ pointer];
}

go_back_one_char() {
  pointer --;
}

while (char = read_next_char()) {
  if (char == '{') {
    if (read_next_char() == '{') InsideBraces();
    else go_back_one_char();
  }
}

InsideBraces(skipping=false) {
  result = "";
  while (char = read_next_char()) {
    if (char == '{') {
      if (read_next_char() == '}') InsideBraces();
      else go_back_one_char();
    } else if (char == '}') {
      if (read_next_char() == '}') break;
      else go_back_one_char();
    } else {
      result += char;
    }
  }
  if (!skipping) results.push(result);
}
0 голосов
/ 08 апреля 2010
m/.*{{([^{]+)}}/

, которая будет захватывать группу между {{и}}, если '{' не присутствует - синтаксис perl

, хотя это лучше сделать с парсером

отредактировано снова.

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