正则表达式 - 希望两个匹配只获得一个

时间:2010-06-07 10:11:27

标签: regex

我正在使用正则表达式,并在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有两个匹配......作为参数。

[更新]就像Tim Pietzcker所写,我使用了贪婪的版本,应该使用懒惰的版本。虽然他写道我用自己解决了它。?而不是。在中间,所以表达式如下所示:

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

那很有用。感谢Tim Pietzcker

2 个答案:

答案 0 :(得分:1)

通常,您必须使用带有“global”标志的正则表达式来查找所有匹配项。在我看到你正在使用的完整代码示例之前,我真的不能说更多。

答案 1 :(得分:1)

你的正则表达式匹配太多 - 从第一个adresse到最后一个",因为它使用了贪婪的量词.*

如果你让量词懒惰,我。即

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

你得到两场比赛。

或者,如果您的数据允许,请使用仅匹配非空格字符的其他量词。这将更快地匹配(但是如果你想要匹配的文本可能包含空格,那么当然会失败):

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