-1

我正在尝试从附加的日志中捕获以下部分:

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

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

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

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

它会忽略“=”和“&”之间的所有部分</p>

所以我得到的结果是:

?tt_adv_id =

&tt_cid=

&tt_adv_sub=

&tt_time =
4

2 回答 2

0

也许,这些简单的表达式会提取我们想要的值:

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

或者

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

该表达式在此演示的右上角面板中进行了说明,如果您希望进一步探索或修改它,并且在此链接中,您可以根据需要逐步观看它如何与一些示例输入匹配。

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}`);
    });
}

于 2019-07-06T06:32:21.737 回答
0

你可以简单地使用

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

在此处输入图像描述

而不是放弃每场比赛的第一个字符,

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)

于 2019-07-06T06:39:42.453 回答