Получить несколько результатов в именованных группах - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь сгруппировать результаты регулярного выражения, используя именованные группы. Именованные группы получают только первый результат, несмотря на установленный глобальный флаг, а сопоставление строк может получить все совпадения, но без их группировки.

Я установил флаги g и m.

var REGEX = new RegExp(/^\s*(?<incorrect>.*\S*.*)\n*(?<corrected>.*\S*.*)[\r|\n]*/, "gm");
var mc = selectedText.match(REGEX);
var mc2 = REGEX.exec(selectedText);

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

mc: Array(3)
0: "maintain their brain and their mind open↵↵maintain an open mind↵↵↵↵"
1: "Our brain works to spend less energy than possible↵↵Our brain works to spend as little energy as possible↵↵↵↵"
2: "They brain is avoid to change↵↵Their brain avoids change"
length: 3

mc2: Array(3) 
0: "maintain their brain and their mind open↵↵maintain an open mind↵↵↵↵"
1: "maintain their brain and their mind open"
2: "maintain an open mind"
groups:
corrected: "maintain an open mind"
incorrect: "maintain their brain and their mind open"
index: 0
input: "maintain their brain and their mind open↵↵maintain an open mind↵↵↵↵Our brain works to spend less energy than possible↵↵Our brain works to spend as little energy as possible↵↵↵↵They brain is avoid to change↵↵Their brain avoids change"
length: 3

1 Ответ

1 голос
/ 23 июня 2019

Итак, кажется, с .exec() вам нужно итеративно применять один и тот же объект регулярного выражения к той же строке, пока он не вернет null, например:

const text = "maintain their brain and their mind open\n\nmaintain an open mind\n\n\n\nOur brain works to spend less energy than possible\n\nOur brain works to spend as little energy as possible\n\n\n\nThey brain is avoid to change\n\nTheir brain avoids change";

var REGEX = new RegExp(/^\s*(?<incorrect>.*\S*.*)\n*(?<corrected>.*\S*.*)[\r|\n]*/, "gm");

let mc;
let mcAll = [];

while ((mc = REGEX.exec(text)) !== null) {
  mcAll.push(mc);
}

console.log(mcAll);

Пример вывода:

[ [ 'maintain their brain and their mind open\n\nmaintain an open mind\n\n\n\n',
    'maintain their brain and their mind open',
    'maintain an open mind',
    index: 0,
    input: 'maintain their brain and their mind open\n\nmaintain an open mind\n\n\n\nOur brain works to spend less energy than possible\n\nOur brain works to spend as little energy as possible\n\n\n\nThey brain is avoid to change\n\nTheir brain avoids change',
    groups: [Object: null prototype] {
      incorrect: 'maintain their brain and their mind open',
      corrected: 'maintain an open mind' } ],
  [ 'Our brain works to spend less energy than possible\n\nOur brain works to spend as little energy as possible\n\n\n\n',
    'Our brain works to spend less energy than possible',
    'Our brain works to spend as little energy as possible',
    index: 67,
    input: 'maintain their brain and their mind open\n\nmaintain an open mind\n\n\n\nOur brain works to spend less energy than possible\n\nOur brain works to spend as little energy as possible\n\n\n\nThey brain is avoid to change\n\nTheir brain avoids change',
    groups: [Object: null prototype] {
      incorrect: 'Our brain works to spend less energy than possible',
      corrected: 'Our brain works to spend as little energy as possible' } ],
  [ 'They brain is avoid to change\n\nTheir brain avoids change',
    'They brain is avoid to change',
    'Their brain avoids change',
    index: 176,
    input: 'maintain their brain and their mind open\n\nmaintain an open mind\n\n\n\nOur brain works to spend less energy than possible\n\nOur brain works to spend as little energy as possible\n\n\n\nThey brain is avoid to change\n\nTheir brain avoids change',
    groups: [Object: null prototype] {
      incorrect: 'They brain is avoid to change',
      corrected: 'Their brain avoids change' } ] ]
...