您如何将Regex子表达式匹配分割为多维字符串数组?
我有一个“myvar”字符串:
1-4:2;5-9:1.89;10-24:1.79;25-99:1.69;100-149:1.59;150-199:1.49;200-249:1.39;250+:1.29
是QuantityLow - QuantityHigh : PriceEach ;
我使用了这个“myreg”正则表达式/(\d+)[-+](\d*):(\d+\.?\d*);?/g
与var myarray = myvar.match(myreg);
产生:
myarray[0] = "1-4:2;"
myarray[1] = "5-9:1.89;"
myarray[2] = "10-24:1.79;"
myarray[3] = "25-99:1.69;"
myarray[4] = "100-149:1.59;"
myarray[5] = "150-199:1.49;"
myarray[6] = "200-249:1.39;"
myarray[7] = "250+:1.29"
优秀!除了我需要在Q1-Q2:P之外进一步打破弦乐,如上所述。正则表达式已设置为使用括号标识零件。我认为这可以使用一个Regex表达式,或者至少两个,而不是设置某种循环。
感谢您的反馈。
答案 0 :(得分:8)
你没有说出你期望的确切输出,但我想这样的输出可能是直观的。
假设:
var myvar = "1-4:2;5-9:1.89;10-24:1.79;25-99:1.69;100-149:1.59;150-199:1.49;200-249:1.39;250+:1.29";
捕获所有子匹配的快捷方法是:
var matches = [];
myvar.replace(/(\d+)[-+](\d*):(\d+\.?\d*);?/g, function(m, a, b, c) {
matches.push([a, b, c])
});
(注意:您可以使用[可能更具可读性]循环捕获相同的输出):
var myreg = /(\d+)[-+](\d*):(\d+\.?\d*);?/g;
var matches = [];
while(myreg.exec(myvar)) {
matches.push([RegExp.$1, RegExp.$2, RegExp.$3])
}
无论哪种方式,结果都是一系列匹配:
matches[0]; // ["1", "4", "2"]
matches[1]; // ["5", "9", "1.89"]
matches[2]; // ["10", "24", "1.79"]
matches[3]; // ["25", "99", "1.69"]
matches[4]; // ["100", "149", "1.59"]
matches[5]; // ["150", "199", "1.49"]
matches[6]; // ["200", "249", "1.39"]
matches[7]; // ["250", "", "1.29"]
答案 1 :(得分:2)
var r = /(\d+)[-+](\d*):(\d+\.?\d*);?/g;
var s = "1-4:2;5-9:1.89;10-24:1.79;25-99:1.69;100-149:1.59;150-199:1.49;200-249:1.39;250+:1.29";
var match;
while ((match = r.exec(s)) != null) {
console.log("From " + match[1] + " to " + match[2] + " is " + match[3]);
}
console.log()
电话是Firefox / Firebug电话。您当然可以使用alert()
,document.write()
或其他任何合适的内容。
请参阅RegExp object reference,尤其是RegExp methods,最值得注意的是RegExp.exec()
。
答案 2 :(得分:0)
最简单的方法 - 使用String的split方法:
var myvar = "1-4:2;5-9:1.89;10-24:1.79;25-99:1.69;100-149:1.59;150-199:1.49;200-249:1.39;250+:1.29";
myvar.split(';');
产生:
["1-4:2", "5-9:1.89", "10-24:1.79", "25-99:1.69", "100-149:1.59", "150-199:1.49", "200-249:1.39", "250+:1.29"]