Регулярное выражение - хотите, чтобы два матча получили только один - PullRequest
0 голосов
/ 07 июня 2010

Я работаю с регулярным выражением и у меня есть несколько строк в JavaScript. Мое выражение должно дать два совпадения, но распознает только одно, и я не знаю, в чем проблема.

Линии в javascript выглядят так:

if(mode==1) var adresse = "?APPNAME=CampusNet&PRGNAME=ACTION&ARGUMENTS=-A7uh6sBXerQwOCd8VxEMp6x0STE.YaNZDsBnBOto8YWsmwbh7FmWgYGPUHysiL9u0.jUsPVdYQAlvwCsiktBzUaCohVBnkyistIjCR77awL5xoM3WTHYox0AQs65SoHAhMXDJVr7="; else var adresse = "?APPNAME=CampusNet&PRGNAME=ACTION&ARGUMENTS=-AHMqmg-jXIDdylCjFLuixe..udPC2hjn6Kiioq7O41HsnnaP6ylFkQLhaUkaWKINEj4l2JqL2eBSzOpmG.b5Av2AvvUxEinUhMBTt5awdgAL4SkBEgYXGejTGUxcgPE-MfiQjefc="; 

Мое выражение выглядит так:

(?<Popup>(popUp\(')|(adresse...")).*\?((?<Parameters>APPNAME=CampusNet[^>"']*["']))

Я хочу иметь два совпадения с APPNAME ...... в качестве параметров.

[ОБНОВЛЕНИЕ] Как писал Тим Пицкер, я использовал жадную версию и должен был использовать ленивую версию. в то время как он написал, что я решил это сам, используя. ? вместо. в середине, поэтому выражение выглядит так:

(?<Popup>(popUp\(')|(adresse...")).*?\\?((?<Parameters>APPNAME=CampusNet[^>"']*["']))

Это сработало. Благодаря Тиму Пицкеру

Ответы [ 2 ]

1 голос
/ 07 июня 2010

Ваше регулярное выражение слишком много - от самого первого adresse до самого последнего ", потому что оно использует жадный квантификатор .*.

Если вы сделаете этот квантификатор ленивым, т.е.

(?<Popup>(popUp\(')|(adresse...")).*?\?((?<Parameters>APPNAME=CampusNet[^>"']*["']))

вы получите два совпадения.

В качестве альтернативы, если ваши данные позволяют это, используйте другой квантификатор, который соответствует только непробельным символам.Это будет соответствовать быстрее (но, конечно, не удастся, если текст, который вы пытаетесь сопоставить, может содержать пробелы):

(?<Popup>(popUp\(')|(adresse..."))\S*\?((?<Parameters>APPNAME=CampusNet[^>"']*["']))
1 голос
/ 07 июня 2010

Обычно вы должны применить регулярное выражение с флагом "global", чтобы найти все совпадения.Я не могу сказать больше, пока не увижу полный пример кода, с которым вы работаете.

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