2016-11-05 158 views
0

我想使用正则表达式智能解析URL查询参数。使用正则表达式解析URL查询参数

事情我已经不得不考虑: 1)PARAMS可以不按顺序 2)只有某些PARAMS必须匹配

给定一个查询字符串:”参数1 = TEST1 &参数2 = test2的& parm3 = test3“ 我想运行javascript正则表达式来解析param1的值和param3的值。

我拿出这么远的正则表达式是:

/(?:[?&](?:param1=([^&]*)|param3=([^&]*)|[^&]*))+$/g 

此正则表达式看起来像https://regex101.com/地盘工作对我罚款。

但是,当我运行下面的JS方法时,我总是得到$ 2的未定义,这是param1的值应该分析的值。任何帮助或建议?

"?param1=test1&param2=test2&param3=test3".replace(
/(?:[?&](?:param1=([^&]*)|param3=([^&]*)|[^&]*))+$/g, 
function ($0, $1, $2, $3) { return $0 + ' ' + $1 + ' ' + $2 + ' ' + $3; }); 

返回$ 2为undefined,$ 3为test3。但是,如果我从url查询字符串中排除param2和param3,我可以成功地将param1解析为$ 2。有点困惑。

谢谢!

+0

加入javascript标签 – prasanth

+0

替换的预期输出是什么? – Damon

+0

我想它$ 0和$ 1输出'test1'和'test3'它可能实际上是一个javascript限制:http://stackoverflow.com/questions/3537878/how-to-capture-an-arbitrary-number-of -groups-in-javascript-regexp –

回答

0

如果它们是以任意顺序,您可以使用lookaheads来查找它们并捕获参数值。你想(为测试字符串)的模式是这样的:

^(?=.*param1=([^&]+)|)(?=.*param2=([^&]+)|)(?=.*param3=([^&]+)|).+$ 

Demo on Regex101

它还将接受缺少参数的查询字符串,因为无论是参数/值对或每个先行交替空字符串,最后使用|

对于你希望抓取的每个参数,你都需要一个额外的前瞻,而且这是无法解决的。因为每个太阳下的正则表达式都是一个state machine,唯一要注意的是使用原始模式是给定捕获组的最近匹配。