我有字符串:
=?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);
};
}
答案 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。