Javascript 按顺序匹配正则表达式模式
我正在构建一个小型解析器,它将获取图像或附件,并构建一个数据数组供我以后使用 我可以用我的模式成功地解析数据,但是,解析原始文本的方法是运行两个单独的匹配循环来获取数据并将其推入数组 因此,最终数组中的数据顺序与原始文本的顺序不符。以下是一个例子: 原始数据Javascript 按顺序匹配正则表达式模式,javascript,regex,Javascript,Regex,我正在构建一个小型解析器,它将获取图像或附件,并构建一个数据数组供我以后使用 我可以用我的模式成功地解析数据,但是,解析原始文本的方法是运行两个单独的匹配循环来获取数据并将其推入数组 因此,最终数组中的数据顺序与原始文本的顺序不符。以下是一个例子: 原始数据 [ATTACH]1234[/ATTACH] [IMG]http://www.google.com/abc.gif[/IMG] [ATTACH]5678[/ATTACH] [IMG]http://www.google.com/def.gif[
[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
实际上,我希望结果数组如下所示
所需结果数组
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++;
}
如果输入总是成对的,那么您可以将它们插入“数组”(注意,您所称的“数组”实际上不是,它是一个普通的“对象”),如下所示:
//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;
}
//单个图像
var模式=/\[IMG]([\s\s]*?)\[\/IMG\]/gi;
var匹配;
daC=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++;
}
事实上,它们并不总是成对的,事实上,它们将是一个长长的图像和附件列表,所有这些都是以非常随机的顺序和分布的:(好主意,但问题是我还有一些其他流程需要执行,这取决于我们是否匹配IMG或ATTACH@Mark:这不是问题,因为您可以使用match[1]