Позитивный взгляд «работает слишком хорошо» в регулярных выражениях - PullRequest
1 голос
/ 07 марта 2012

Шаблон соответствует больше, чем предполагалось. Если кто-то может объяснить, почему «адрес» совпадает, когда он является частью обзора, и как это предотвратить. Заранее спасибо за любую помощь в этом.

Шаблон:

(?<=@address|)[a-zA-Z]+(?=[^\]\[]*\])

Строка:

test [@address|singleline second] test

Результаты:

address singleline second

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Вам нужно сбежать от |:

(?<=@address\|)[a-zA-Z]+(?=[^\]\[]*\])

, поскольку (?<=@address|) утверждает, что сопоставляемой строке предшествует либо @address, либо пустая строка. (А поскольку all равно всегда , которому предшествует пустая строка, это не имеет никакого эффекта.)

Кстати, небольшая терминологическая заметка: (?<=@address|) называется взглядом позади , а не взглядом впереди . Взгляд впереди , такой как ваше (?=[^\]\[]*\]), утверждает, что заданная точка в регулярном выражении является (или не является) с последующим указанным шаблоном.

0 голосов
/ 07 марта 2012

осмотры даже не нужны.

Похоже, вы хотите, чтобы результат был «однострочным». (ваш токен a-zA-Z состоит только из букв, а внутренние данные разделены пробелом, таков будет весь шаблон.)

и адрес | статичен.

Итак, почему бы не сделать меньше, оглядываясь по сторонам, и просто потреблять :

/@address\|(\w+).*?\]/g   //$1 has the capture.

одно возможное преимущество, помимо упрощения: если бы вам пришлось выполнять это глобально для большого количества данных, вы бы соответствовали этому последнему ], а не только e в «однострочном».

...