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

正则表达式匹配&foo =之间的所有内容,直到再次出现

正则表达式匹配&foo =之间的所有内容,直到再次出现

慕神8447489 2021-05-14 14:15:02
我正在使用JavaScript,我需要一个正则表达式来匹配“ foo”之间的所有内容。当我使用以下字符串时。&foo=test1&foo=test2&foo=test3%20test4它应该返回match1: test1match2: test2match3: test3%20test4我尝试了以下表达式((&foo=)(.*))*但不幸的是,它返回了整个字符串。如何改善我的正则表达式表达?
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

该表达式不使用.*,相反,foo=在下一个之间添加一个字符列表可能是安全的&,可能类似于:

foo=([A-z0-9%]+)&?

然后,使用捕获组可以捕获任何您想要的东西。

如果愿意,您可以在此链接中测试/修改/更改/练习您的表达式。

//img1.sycdn.imooc.com//60af5fef000139ce04390193.jpg

RegEx描述图

链接可帮助您形象化您的表情:

//img1.sycdn.imooc.com//60af5ff90001dc1003780249.jpg

如果需要,可以在表达式中添加其他边界。

您还可以扩展字符列表。

JavaScript测试

const regex = /foo=([A-z0-9%]+)&?/gm;

const str = `&foo=test1&foo=test2&foo=test3%20test4&foo=test1&foo=test2&foo=test3%20test4&foo=test1&foo=test2&foo=test3%20test4`;

let m;


while ((m = regex.exec(str)) !== null) {

    // This is necessary to avoid infinite loops with zero-width matches

    if (m.index === regex.lastIndex) {

        regex.lastIndex++;

    }

    

    // The result can be accessed through the `m`-variable.

    m.forEach((match, groupIndex) => {

        console.log(`Found match, group ${groupIndex}: ${match}`);

    });

}

根据toto的建议,最好更改A-zA-Za-z或者可以根据Limbo的建议a-z与flag一起使用i,因为A-z还会传递其他字符,例如[]

foo=([A-Z-a-z0-9%]+)&?


查看完整回答
反对 回复 2021-05-27
?
MMTTMM

TA贡献1869条经验 获得超4个赞

建议不要使用正则表达式,而建议使用内置URLSearchParams类:


const params = new URLSearchParams('&foo=test1&foo=test2&foo=test3%20test4');


params.getAll('foo');

// ["test1", "test2", "test3 test4"]

在所有主流浏览器中均可使用。(如果这对您很重要,则需要IE 11的polyfill。)


查看完整回答
反对 回复 2021-05-27
  • 3 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

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