Создание RegExp
Вы не показали как вы создаете регулярное выражение 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]
и т. Д. - ваши группы захвата.)