Просто, чтобы придерживаться предложенного вопроса, как указано в заголовке, вы можете фактически перебирать каждое совпадение в строке, используя String.prototype.replace()
. Например, следующее делает именно это, чтобы получить массив всех слов на основе регулярного выражения:
function getWords(str) {
var arr = [];
str.replace(/\w+/g, function(m) {
arr.push(m);
});
return arr;
}
var words = getWords("Where in the world is Carmen Sandiego?");
// > ["Where", "in", "the", "world", "is", "Carmen", "Sandiego"]
Если бы я хотел получить группы захвата или даже индекс каждого совпадения, я бы тоже мог это сделать. Ниже показано, как возвращается каждое совпадение с полным совпадением, 1-й группой захвата и индексом:
function getWords(str) {
var arr = [];
str.replace(/\w+(?=(.*))/g, function(m, remaining, index) {
arr.push({ match: m, remainder: remaining, index: index });
});
return arr;
}
var words = getWords("Where in the world is Carmen Sandiego?");
После выполнения вышеуказанного words
будет выглядеть следующим образом:
[
{
"match": "Where",
"remainder": " in the world is Carmen Sandiego?",
"index": 0
},
{
"match": "in",
"remainder": " the world is Carmen Sandiego?",
"index": 6
},
{
"match": "the",
"remainder": " world is Carmen Sandiego?",
"index": 9
},
{
"match": "world",
"remainder": " is Carmen Sandiego?",
"index": 13
},
{
"match": "is",
"remainder": " Carmen Sandiego?",
"index": 19
},
{
"match": "Carmen",
"remainder": " Sandiego?",
"index": 22
},
{
"match": "Sandiego",
"remainder": "?",
"index": 29
}
]
Чтобы сопоставить несколько вхождений, похожих на то, что доступно в PHP, с preg_match_all
, вы можете использовать этот тип мышления для создания собственного или использовать что-то вроде YourJS.matchAll()
, YourJS более или менее определяет эту функцию следующим образом:
function matchAll(str, rgx) {
var arr, extras, matches = [];
str.replace(rgx.global ? rgx : new RegExp(rgx.source, (rgx + '').replace(/[\s\S]+\//g , 'g')), function() {
matches.push(arr = [].slice.call(arguments));
extras = arr.splice(-2);
arr.index = extras[0];
arr.input = extras[1];
});
return matches[0] ? matches : null;
}