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

Matching regex patterns in order

本文关键字:正则表达式 模式 顺序      更新时间:2023-09-26

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

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

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

原始数据

[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++;
}

您可以将所有内容放在一个模式中:

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++;
}

如果输入总是成对的,那么你可以将它们插入到你的"数组"中(注意,你称之为"数组"的实际上不是,它是一个普通的"对象"),如下所示:

//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"项。