Regex для захвата нескольких литералов индекса массива внутри строки - PullRequest
2 голосов
/ 20 января 2020

Возможно, для кого-то просто, но я хочу создать регулярное выражение, которое будет искать по этой строке:

foo[0][2]

и возвращать

foo
0
2

в массиве совпадений

До сих пор я придумал

\([a-z]*)(\[(\d)\])/g

, который возвращает только

0: "foo[0]"
1: "foo"
2: "[0]"
3: "0"

Он не повторяется в следующем массиве литералов в моей строке, поэтому не удар по части [2].

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 20 января 2020

Я думаю, что вы ищете эту модель: ([a-z]+)|(\[\d\])

console.log('foo[0][2]'.match(/([a-z]+)|(\[\d\])/g));

Если вам не нужны детали [], вы можете попробовать это:

console.log('foo[0][2]'.match(/([a-z]+)|(\d)/g));
2 голосов
/ 20 января 2020

Если вы используете шаблон ([a-z]*)(\[(\d)\]), вы можете использовать некоторое время l oop, чтобы получить первую и третью группы захвата, но учтите, что использование [a-z]* соответствует 0+ раз и может также соответствовать частям в [0][2] например .

const regex = /([a-z]*)(\[(\d)\])/g;
const str = `foo[0][2]`;
let m;
let result = [];
while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches

  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  if (m[1] !== "") result.push(m[1]);
  if (m[3] !== "") result.push(m[3]);
}
console.log(result);

Если вы хотите соответствовать этому точному формату, вы можете использовать 2 группы захвата для первого совпадения foo в группе 1 и [0][2] в группе 2

\b([a-z]+)((?:\[\d])+)

Пояснение

  • \b Граница слова
  • ( Захват группа 1
    • [a-z]+ Совпадение 1+ раз за символ аз
  • ) Закрыть группу
  • ( Захват группа 2
    • (?:\[\d])+ Повторить 1+ раз, сопоставляя один ди git между [] (используйте \d+ для соответствия 1 или более)
  • ) Закрыть группу

Regex demo

Если этот шаблон соответствует, вы можете получить все цифры из группы 2, поскольку общий шаблон уже соответствует.

const pattern = /\b([a-z]+)((?:\[\d])+)/;
let parts = "foo[0][2]".match(pattern);
console.log([parts[1], ...parts[2].match(/\d/g)]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...