RegEx для сопоставления нескольких вхождений после просмотра - PullRequest
3 голосов
/ 04 июня 2019

Я получил следующий отрывок в текстовом файле:

(default) AA / BBB)
ASDF / XYZ / GE
(default) CCCC)

Я хочу сопоставить все заглавные буквы (2-4) после (default) с закрывающей скобкой, поэтому AA, BBB и CCCC совпадают.

Это то, что я придумал, но оно не соответствует BBB:

(?<=default\)\s)[A-Z]{2,4}

Так что же мне не хватает, чтобы соответствовать более чем одной группе заглавных букв после (default)?

1 Ответ

2 голосов
/ 04 июня 2019

Если мы хотим соответствовать только шаблону в вопросе, мы просто пропустим наши желаемые случаи и откажемся от другого, используя (default):

\(default\)(.+?([A-Z]{2,4}).+?([A-Z]{2,4})|.+?([A-Z]{2,4}))

Demo 1

или:

(?=\(default\))(.+?([A-Z]{2,4}).+?([A-Z]{2,4})|.+?([A-Z]{2,4})).+

Демо 2

const regex = /\(default\)(.+?([A-Z]{2,4}).+?([A-Z]{2,4})|.+?([A-Z]{2,4}))/gm;
const str = `(default) AA / BBB)
ASDF / XYZ / GE
(default) CCCC)`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...