匹配所有以特定单词开头和结尾的摘录

时间:2011-08-03 21:21:16

标签: javascript regex pattern-matching match

我的文字看起来像是:

some non interesting part
trans-top
body of first excerpt
trans-bottom
next non interesting part
trans-top
body of second excerpt
trans-bottom
non interesting part

我想提取所有以trans-top开头并以trans-bottom结尾的摘录为数组。我试过了:

match(/(?=trans-top)(.|\s)*/g)

找到以trans-top开头的字符串。它有效。现在我想指定结束:

match(/(?=trans-top)(.|\s)*(?=trans-bottom)/g)

并没有。 Firebug给了我一个错误:

  

正则表达式过于复杂

我尝试了许多其他方法,但我找不到合适的解决方案......我很害羞,我犯了一些愚蠢的错误:(。

2 个答案:

答案 0 :(得分:1)

这很有效,但并不是所有的正则表达式都是:

var test = "some non interesting part\ntrans-top\nbody of first excerpt\ntrans-bottom\nnext non interesting part\ntrans-top\nbody of second excerpt\ntrans-bottom\nnon interesting part";

var matches = test.match(/(trans-top)([\s\S]*?)(trans-bottom)/gm);
for(var i=0; i<matches.length; i++) {
    matches[i] = matches[i].replace(/^trans-top|trans-bottom$/gm, '');
}

console.log(matches);

如果您不想要前导和尾随换行符,请将内部循环更改为:

matches[i] = matches[i].replace(/^trans-top[\s\S]|[\s\S]trans-bottom$/gm, '');

应该吃掉线路。

答案 1 :(得分:1)

这个测试过的函数使用一个正则表达式并循环挑选每个匹配的内容,将它们全部放在一个返回的数组中:

function getParts(text) {
    var a = [];
    var re = /trans-top\s*([\S\s]*?)\s*trans-bottom/g;
    var m = re.exec(text);
    while (m != null) {
        a.push(m[1]);
        m = re.exec(text);
    }
    return a;
}

它还会过滤掉每个匹配内容周围的任何lealding和尾随空格。