不捕获正则表达式中的最后一组

时间:2019-05-03 08:51:31

标签: javascript regex regex-group

我正在使用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 :(得分:0)

此正则表达式应解决您的问题:/(.*?)(&&|\||;|\r|$)/gm 添加$使其也匹配“行尾”。

答案 1 :(得分:0)

您可以使用(.+?)(&&|\||;|$)$来声明行的结尾,并使用.+?来匹配除换行符以外的任何字符1次或多次,以防止匹配空字符串。 / p>

如果您还想匹配逗号,则可以将其添加到替换中。

请注意,您正在使用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()}`)
  })
}