Не захватывает последнюю группу в регулярном выражении - PullRequest
1 голос
/ 03 мая 2019

Я использую регулярное выражение JavaScript для разделения нескольких команд, используя разделители (&&,;, |) для определения границ команд. Это хорошо работает для всех, кроме последней команды. В качестве хака я могу добавить новую строку в конец команды для захвата последней группы. Вот код.

const regex = /(.*?)(&&|\||;|\r?\n)/gm
// The EOL is a hack to capture the last command
const test = 'read -p test TEST && echo | ls -lh ~/bin; test | echo\n'
let m

while ((m = regex.exec(test)) !== null) {
  m.forEach((match, groupIndex) => {
    console.log(`Found match, group ${groupIndex}: ${match.trim()}`)
  })
}

Есть ли способ изменить регулярное выражение, чтобы оно захватывало последнюю группу без взлома?

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Вы можете использовать (.+?)(&&|\||;|$), используя $, чтобы утверждать конец строки, и использовать .+?, чтобы соответствовать любому символу, кроме новой строки, 1 или более раз, чтобы предотвратить сопоставление пустой строки.

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

Обратите внимание, что вы используете 2 группы захвата. Если вы не используете данные из группы 2, вы можете сделать так, чтобы они не фиксировались вместо (?:

const regex = /(.+?)(&&|\||;|$)/gm;
const test = 'read -p test TEST && echo | ls -lh ~/bin; test | echo\n';
let m;

while ((m = regex.exec(test)) !== null) {
  m.forEach((match, groupIndex) => {
    console.log(`Found match, group ${groupIndex}: ${match.trim()}`)
  })
}
0 голосов
/ 03 мая 2019

Это регулярное выражение должно решить вашу проблему: /(.*?)(&&|\||;|\r|$)/gm Добавление $ также приводит к совпадению с «окончаниями строки».

...