按顺序匹配正则表达式模式

时间:2013-06-22 14:04:34

标签: javascript regex

我正在构建一个迷你解析器,它将获取图像或附件,并构建一个数据数组供我以后使用。

我可以使用我的模式成功解析数据,但是,我解析原始文本的方式是运行两个单独的匹配循环来获取数据并推入数组。

因此,我的最终数组中的数据顺序相对于原始文本是无序的。这是一个例子:

原始数据

[ATTACH]1234[/ATTACH]
[IMG]http://www.google.com/abc.gif[/IMG]
[ATTACH]5678[/ATTACH]
[IMG]http://www.google.com/def.gif[/IMG]

结果阵列

0 : http://www.google.com/abc.gif
1 : http://www.google.com/def.gif
2 : 1234
3 : 5678

实际上,我希望结果数组看起来像这样

期望的结果阵营

0 : 1234
1 : http://www.google.com/abc.gif
2 : 5678
3 : http://www.google.com/def.gif

这是我正在使用的代码缩短版本

//Container Array of Images
var imagesContainerArray = {};
var daC = 0;
var finalData = {};


//Individual Images 
var pattern = /\[IMG]([\s\S]*?)\[\/IMG\]/gi;
var match;

while (match = pattern.exec(text)) {  

    finalImageUrl = match[1];

            //Other stuff i'm doing 

    imagesContainerArray[daC] = finalImageUrl;

    daC++;
}

//Individual ATTACH 
var pattern = /\[ATTACH]([\s\S]*?)\[\/ATTACH\]/gi;
var match;

while (match = pattern.exec(text)) {  

    finalImageUrl = match[1];

            //Other stuff i'm doing 

    imagesContainerArray[daC] = finalImageUrl;

    daC++;
}

2 个答案:

答案 0 :(得分:1)

你可以将所有模式放在一个模式中:

var pattern = /\[(IMG|ATTACH)]([\s\S]*?)\[\/\1\]/gi;
var match;

while (match = pattern.exec(text)) {  

    finalImageUrl = match[2];

    imagesContainerArray[daC] = finalImageUrl;

    daC++;
}

要根据标签名称应用不同的处理,您可以使用switch / case语句。例如:

var pattern = /\[(IMG|ATTACH)]([\s\S]*?)\[\/\1\]/gi;
var match;

while (match = pattern.exec(text)) {  

    finalImageUrl = match[2];

    switch (match[1].toUpperCase()) {
        case "IMG":    ...
                       break;
        case "ATTACH": ...
                       break;
        ...
    }

    imagesContainerArray[daC] = finalImageUrl;

    daC++;
}

答案 1 :(得分:0)

如果输入总是成对成对,你可以将它们插入到你的“数组”中(注意你所谓的“数组”实际上不是,它是一个简单的“对象”),如下所示:

//Individual Images 
var pattern = /\[IMG]([\s\S]*?)\[\/IMG\]/gi;
var match;
daC = 1;  // <=- Note starting index
while (match = pattern.exec(text)) {
    finalImageUrl = match[1];
            //Other stuff i'm doing 
    imagesContainerArray[daC] = finalImageUrl;
    daC+=2;
}
//Individual ATTACH 
var pattern = /\[ATTACH]([\s\S]*?)\[\/ATTACH\]/gi;
var match;
daC = 0;  // <=- Note starting index
while (match = pattern.exec(text)) {
    finalImageUrl = match[1];
            //Other stuff i'm doing 
    imagesContainerArray[daC] = finalImageUrl;
    daC+=2;
}

即插入带有偶数索引的“ATTACH”项目,并插入带有奇数索引的“IMG”项目。