创建正则表达式
您还没有展示如何您正在创建您的 Javascript 正则表达式,例如,您是否使用文字:
var rex = /([a-z]+)((\d+)([a-z]+))?,?/;
或字符串
var rex = new RegExp("([a-z]+)((\\d+)([a-z]+))?,?");
如果是后者,请注意我已经转义了反斜杠。
全球标志
默认情况下,Javascript 正则表达式不是全局的,这对您来说可能是个问题。如果您还没有 g 标志,请添加它:
var rex = /([a-z]+)((\d+)([a-z]+))?,?/g;
或
var rex = new RegExp("([a-z]+)((\\d+)([a-z]+))?,?", "g");
使用RegExp#exec 而不是String#match
您的编辑表明您正在使用String#match 来获取匹配数组。我不得不承认我几乎从不使用String#match(我使用RegExp#exec,如下所示。)当我将String#match 与您的正则表达式一起使用时,我得到......非常奇怪的结果因浏览器而异。使用RegExp#exec 循环不会这样做,所以我会这样做。
工作示例
此代码可以满足您的要求:
var rex, str, match, index;
rex = /([a-z]+)((\d+)([a-z]+))?,?/g;
str = "water2cups,flour4cups,salt2teaspoon";
rex.lastIndex = 0; // Workaround for bug/issue in some implementations (they cache literal regexes and don't reset the index for you)
while (match = rex.exec(str)) {
log("Matched:");
for (index = 0; index < match.length; ++index) {
log(" match[" + index + "]: |" + match[index] + "|");
}
}
(log 函数只是将文本附加到 div。)
我的输出是:
Matched:
match[0]: |water2cups,|
match[1]: |water|
match[2]: |2cups|
match[3]: |2|
match[4]: |cups|
Matched:
match[0]: |flour4cups,|
match[1]: |flour|
match[2]: |4cups|
match[3]: |4|
match[4]: |cups|
Matched:
match[0]: |salt2teaspoon|
match[1]: |salt|
match[2]: |2teaspoon|
match[3]: |2|
match[4]: |teaspoon|
(回想一下,在 Javascript 中,match[0] 将是 整个 匹配项;然后 match[1] 等是您的捕获组。)