Как создать регулярное выражение для захвата {этого} текста и исключения \ {этого}? - PullRequest
1 голос
/ 27 сентября 2010

Мне нужно регулярное выражение для захвата имен полей, перечисленных в строке.Они перечислены между Вот мои требования:

  1. имена полей в фигурных скобках
  2. имена полей без пробелов
  3. фигурные скобки можно экранировать с помощью \

Итак, в следующем:

capture {this} text and exclude \{that}?

Совпадения {это}, но не {это}.

Я использую PHP и preg_match (я мог бы использоватьфункция diff, я открыт для идей)

Есть идеи?Не забудьте объяснить мне и результат, чтобы я мог чему-то научиться:)

Ответы [ 2 ]

1 голос
/ 27 сентября 2010
$s = 'capture {this} text and exclude \{that} {a} \{b} {c}?';
preg_match_all('~(?<!\\\){[^}]+}~', $s, $matches);
var_dump($matches);

Подробнее о негативном утверждении вы можете прочитать (?<! здесь

1 голос
/ 27 сентября 2010

Вы можете использовать отрицательный вид сзади: (?<!\\)\{[^}]+\}.(Не забудьте экранировать \ для PHP)

Выражение (?<!something) является утверждением нулевой ширины, которое позволяет только следующему выражению соответствовать тексту, которому не предшествует something.
Таким образом, это регулярное выражение соответствует \{[^}]+\}, только если ему не предшествует \\.(\ должен быть экранирован)

...