提取多个细分的问题

时间:2019-07-06 06:23:22

标签: javascript regex

我正在尝试从随附的日志中捕获波纹管部分:

aff_lsr?tt_adv_id=806&tt_cid=&tt_adv_sub=b3fff3722fc6b52aedde9b86bb22bf23&tt_time=2016-04-05+16%3A08%3A18&

应捕获:

●   tt_adv_id
●   806
●   tt_adv_sub 
●   b3fff3722fc6b52aedde9b86bb22bf23
●   tt_time
●   2016-04-05+16%3A08%3A18

我试图创建一个正则表达式来提取所有以“?”,“&”或“ =”开头,以“ =”或“&”结尾的字符串

这是我尝试过的正则表达式:

(?=[?/&/=]).*?(=)|(?=[=/&])

它将忽略“ =”和“&”之间的所有部分

所以我得到的结果是:

?tt_adv_id =

&tt_cid=

&tt_adv_sub=

&tt_time =

2 个答案:

答案 0 :(得分:1)

也许这些简单的表达式可以提取出我们想要的值:

.*(tt_adv_id)=([^&]*)&(?:tt_cid)=(?:[^&]*)&(tt_adv_sub)=([^&]*)&(tt_time)=([^&]*).*

(tt_adv_id)=([^&]*)&(?:tt_cid)=(?:[^&]*)&(tt_adv_sub)=([^&]*)&(tt_time)=([^&]*)

该表达式在this demo的右上角进行了说明,如果您想进一步探索或修改它,在this link中,您可以逐步观察它如何与某些示例输入匹配步骤,如果您愿意的话。

const regex = /.*(tt_adv_id)=([^&]*)&(?:tt_cid)=(?:[^&]*)&(tt_adv_sub)=([^&]*)&(tt_time)=([^&]*).*/gm;
const str = `aff_lsr?tt_adv_id=806&tt_cid=&tt_adv_sub=b3fff3722fc6b52aedde9b86bb22bf23&tt_time=2016-04-05+16%3A08%3A18&
`;
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}`);
    });
}

答案 1 :(得分:1)

您可以简单地使用

/[?&=]([^&=]+)/
  • [?&=]-匹配?, & or =
  • ([^&=]+)-匹配& and =以外的任何内容一次或多次

enter image description here

然后删除每个匹配项的第一个字符

let str = "aff_lsr?tt_adv_id=806&tt_cid=&tt_adv_sub=b3fff3722fc6b52aedde9b86bb22bf23&tt_time=2016-04-05+16%3A08%3A18&"

let matched = str.match(/[?&=]([^&=]+)/g).map((v)=>v.substr(1))

console.log(matched)