0

我有字符串:

=?windows-1256?B?IObH4cPM5dLJIA==?= =?windows-1256?B?x+HYyO3JIC4uLg==?= =?windows-1256?B?LiDH4djj5s3Hyg==?= =?windows-1256?B?Rlc6IOTP5skgKA ==?=

我需要提取 和 之间的所有匹配?B?==?=

结果我需要:

IObH4cPM5dLJIA

x+HYyO3JIC4uLg

LiDH4djj5s3Hyg

Rlc6IOTP5skgKA

PS 此字符串取自 textarea,在函数执行后,脚本应将当前 textarea 值替换为结果。我什么都试过了

var result = str.substring(str.indexOf('?B?')+3,str.indexOf('==?='));    

几乎按照我需要的方式工作,但它只找到第一个匹配项。这不起作用:

function Doit(){
    var str = $('#test').text();
    var pattern = /(?B?)([\s\S]*?)(==?=)/g;
    var result = str.match(pattern);

    for (var i = 0; i < result.length; i++) {
        $('#test').html(result);
    };
}
4

2 回答 2

0

?在正则表达式中具有特殊含义,它匹配前面的字符 0 或 1 次。

所以,?应该用\?


所以正则表达式应该是

(?:\?B\?)(.*?)(?:==\?=) 

[\s\S]没有效果,类似于.

于 2013-02-01T11:08:27.050 回答
0

元字符?需要转义,即\?它被视为文字?

[\s\S]很重要,因为它匹配所有字符,包括换行符。

var m,
    pattern = /\?B\?([\s\S]*?)==\?=/g;

while ( m = pattern.exec( str ) ) {
    console.log( m[1] );
}

// IObH4cPM5dLJIA
// x+HYyO3JIC4uLg
// LiDH4djj5s3Hyg
// Rlc6IOTP5skgKA

或者用更长但可能更清晰的方式来编写上述循环:

m = pattern.exec( str );

while ( m != null ) {
    console.log( m[1] );
    m = pattern.exec( str );
}

使用全局标志时, Stringmatch方法不返回捕获组,而只返回完整匹配本身。

exec相反,可以从对 RegExp方法的多次调用中收集全局匹配的捕获组匹配。匹配的索引0是完整匹配,并且进一步的索引对应于每个捕获组匹配。请参阅MDN 执行

于 2013-02-01T12:47:32.983 回答