为了账号安全,请及时绑定邮箱和手机立即绑定

如何在JavaScript中使用类似于PHP的preg_match_all()的正则表达式匹配

/ 猿问

如何在JavaScript中使用类似于PHP的preg_match_all()的正则表达式匹配

倚天杖 2019-08-31 11:10:15

我试图解析是由由两种分离的key = value对的URL编码的字符串&或&。


以下内容仅匹配第一次出现,将键和值分解为单独的结果元素:


var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)

字符串'1111342 = Adam%20Franco&348572 = Bob%20Jones'的结果将是:


['1111342', 'Adam%20Franco']

使用全局标志'g'将匹配所有匹配项,但仅返回完全匹配的子字符串,而不是分离的键和值:


var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)

字符串'1111342 = Adam%20Franco&348572 = Bob%20Jones'的结果将是:


['1111342=Adam%20Franco', '&348572=Bob%20Jones']

虽然我可以&单独拆分字符串并分别拆分每个键/值对,但是有没有办法使用JavaScript的正则表达式支持来匹配模式的多次出现,/(?:&|&)?([^=]+)=([^&]+)/类似于PHP的preg_match_all()函数?


我的目标是通过某种方式获得结果,子匹配分开如下:


[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]

要么


[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]


查看完整描述

3 回答

?
斯蒂芬大帝

我建议使用替代正则表达式,使用子组单独捕获参数的名称和值:


function getUrlParams(url) {

  var re = /(?:\?|&(?:amp;)?)([^=&#]+)(?:=?([^&#]*))/g,

      match, params = {},

      decode = function (s) {return decodeURIComponent(s.replace(/\+/g, " "));};


  if (typeof url == "undefined") url = document.location.href;


  while (match = re.exec(url)) {

    params[decode(match[1])] = decode(match[2]);

  }

  return params;

}


var result = getUrlParams("http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=Frankfurt+am+Main&sll=50.106047,8.679886&sspn=0.370369,0.833588&ie=UTF8&ll=50.116616,8.680573&spn=0.35972,0.833588&z=11&iwloc=addr");

result 是一个对象:


{

  f:“q”

  地理编码:“”

  hl:“de”

  即:“UTF8”

  iwloc:“addr”

  ll:“50.116616,8.680573”

  问:“美因河畔法兰克福”

  sll:“50.106047,8.679886”

  来源:“s_q”

  spn:“0.35972,0.833588”

  sspn:“0.370369,0.833588”

  z:“11”

}

正则表达式分解如下:


(?:#非捕获组

  \?|&#“?” 要么 ”&”

  (?:放大器;)?#(对于错误的HTML编码的网址,请允许“&”)

)#end非捕获组

(#组1

  [^ =&#] +#除“=”,“&”或“#”之外的任何字符; 至少一次

)#end end 1  - 这将是参数的名称

(?:#非捕获组

  =?#an“=”,可选

  (#组2

    [^&#] *#除“&”或“#”之外的任何字符; 任何次数

  )#end end 2  - 这将是参数的值

)#end非捕获组


查看完整回答
反对 回复 2019-08-31
?
慕后森

您需要使用'g'开关进行全局搜索


var result = mystring.match(/(&|&)?([^=]+)=([^&]+)/g)


查看完整回答
反对 回复 2019-08-31
?
慕妹3242003

如果你不想依赖于运行exec样式匹配所带来的“盲目匹配” ,那么JavaScript确实带有内置的全匹配功能,但它是replace函数调用的一部分,当使用“如何处理捕获”时小组“ 处理功能:


var data = {};


var getKeyValue = function(fullPattern, group1, group2, group3) {

  data[group2] = group3;

};


mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, getKeyValue);

完成。


而不是使用捕获组处理函数来实际返回替换字符串(对于替换处理,a这里调用的第一个arg 是完整模式匹配,后续args是单独的捕获组,在这种情况下b是组1,c组2等)我们只需捕获第2组和第3组,并缓存该对。


因此,不要编写复杂的解析函数,请记住JavaScript中的“matchAll”函数只是用替换处理函数“替换”,并且可以获得很多模式匹配效率。


查看完整回答
反对 回复 2019-08-31

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信