从给定字符串中提取所有匹配项

时间:2013-02-01 10:57:52

标签: javascript regex split match trim

我有字符串:

  

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

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

因此我需要:

  

IObH4cPM5dLJIA

     

X + HYyO3JIC4uLg

     

LiDH4djj5s3Hyg

     

Rlc6IOTP5skgKA

P.S。此字符串取自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);
    };
}

2 个答案:

答案 0 :(得分:0)

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

因此,?应使用\?

进行转义

所以正则表达式应该是

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

[\s\S]无效,与.

类似

答案 1 :(得分: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 );
}

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

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