Как зациклить все элементы, которые соответствуют регулярному выражению? - PullRequest
36 голосов
/ 03 августа 2009

Вот случай: Я хочу найти элементы, которые соответствуют регулярному выражению ...

targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"

и я использую регулярное выражение в javascript, как это

reg = new RegExp(/e(.*?)e/g);   
var result = reg.exec(targetText);

и я получаю только первое, а не следующее .... Я могу получить только T1, но не T2, T3 ... ...

Ответы [ 6 ]

63 голосов
/ 03 августа 2009
var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}
11 голосов
/ 03 августа 2009

Попробуйте использовать match () в строке вместо exec (), хотя вы также можете выполнить цикл с exec. Матч должен дать вам все матчи за один раз. Я думаю, что вы также можете опустить глобальный спецификатор.

reg = new RegExp(/e(.*?)e/);   
var matches = targetText.match(reg);
10 голосов
/ 13 марта 2018

Три подхода в зависимости от того, что вы хотите с ним сделать:

  • Цикл каждого матча: .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].
    } 
    
2 голосов
/ 03 августа 2009
targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"    
reg = new RegExp(/e(.*?)e/g);   
var result;
while (result = reg.exec(targetText))
{
    ...
}
1 голос
/ 31 августа 2018

Я продолжал получать бесконечные циклы, следуя совету выше, например:

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);
}
0 голосов
/ 19 февраля 2019

Вы также можете использовать метод 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']

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...