Ответ 1
var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
doSomethingWith(result);
}
Вот так: Я хочу найти элементы, которые соответствуют регулярному выражению...
targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"
и я использую регулярное выражение в javascript, подобном этому
reg = new RegExp(/e(.*?)e/g);
var result = reg.exec(targetText);
и я получаю только первый, но не следующий. Я могу получить только T1, но не T2, T3......
var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
doSomethingWith(result);
}
Попробуйте использовать match() в строке вместо exec(), хотя вы также можете выполнить цикл с exec. Матч должен дать вам все матчи за один раз. Я думаю, что вы также можете опустить глобальный спецификатор.
reg = new RegExp(/e(.*?)e/);
var matches = targetText.match(reg);
Три подхода в зависимости от того, что вы хотите с ним сделать:
Цикл каждого матча: .match
targetText.match(/e(.*?)e/g).forEach((element) => {
// Do something with each element
});
Цикл и замена каждого матча на лету: .replace
const newTargetText = targetText.replace(/e(.*?)e/g, (match, $1) => {
// Return the replacement leveraging the parameters.
});
Цикл и сделать что-то на лету: .exec
const regex = /e(.*?)e/g; // Must be declared outside the while expression,
// and must include the global "g" flag.
let result;
while(result = regex.exec(targetText)) {
// Do something with result[0].
}
targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"
reg = new RegExp(/e(.*?)e/g);
var result;
while (result = reg.exec(targetText))
{
...
}
Я продолжал получать бесконечные циклы, следуя совету выше, например:
var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
doSomethingWith(result);
}
Объект, который был назначен для result
каждый раз, был:
["", "", index: 50, input: "target text", groups: undefined]
Так что в моем случае я отредактировал приведенный выше код для:
const reg = /e(.*?)e/g;
let result = reg.exec(targetText);
while(result[0] !== "") {
doSomethingWith(result);
result = reg.exec(targetText);
}
Вы также можете использовать метод String.replace для циклического прохождения всех элементов.
result = [];
// Just get all numbers
"SomeT1extSomeT2extSomeT3ext".replace(/(\d+?)/g, function(wholeMatch, num) {
// act here or after the loop...
console.log(result.push(num));
return wholeMatch;
});
console.log(result); // ['1', '2', '3']
Привет