【问题标题】:Extract all matches from given string从给定字符串中提取所有匹配项
【发布时间】:2013-02-01 10:57:52
【问题描述】:

我有字符串:

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

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

因此我需要:

IObH4cPM5dLJIA

x+HYyO3JIC4uLg

LiDH4djj5s3Hyg

Rlc6IOTP5skgKA

附:此字符串取自 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);
    };
}

【问题讨论】:

  • 使用模式:/(\?B\?)(.*?)(==\?=)/g
  • 谢谢!几乎是我需要的

标签: javascript regex split match trim


【解决方案1】:

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

所以,? 应该用\? 转义


所以正则表达式应该是

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

[\s\S]没有作用,和.类似

【讨论】:

  • 谢谢。这很有帮助,几乎可以满足我的需要。现在它生成:?B?IObH4cPM5dLJIA==?=?B?x+HYyO3JIC4uLg==?=?B?LiDH4djj5s3Hyg==?=?B?Rlc6IOTP5skgKA==?= 如何删除?B?和 ==?= 来自结果以及如何在结果之间添加换行符?
  • @Artjom 您需要访问组 1 的值..here's 它是如何完成的
  • 哦,我做到了。也许这不是一种优雅的方式,但是它可以工作:) function Doit(){var str = $('#test').text();var pattern = /(\?B\?)(.*?)(= =\?=)/g;var 结果 str.match(pattern); $('#test').html(结果); var cont = $('#test').text(); var final = cont.replace(/(\?B\?)/g,''); var final2 = final.replace(/(==\?=)/g,'
    '); $('#test').html(final2);}
【解决方案2】:

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

[\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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2019-10-10
    • 2019-09-08
    • 1970-01-01
    • 2017-11-14
    • 2017-12-14
    • 2013-10-01
    相关资源
    最近更新 更多