除特殊情况外,如何获取组匹配模式

时间:2019-06-18 15:42:10

标签: javascript regex regex-group

我正在尝试从字符串中获取除<:randomtext:123><a:randomtext:123>格外的所有:randomtext:模板,并用另一个字符串替换它们。我如何获得所有这些团体?

尝试

[^<](:\w+?:)

这是我的demo

2 个答案:

答案 0 :(得分:0)

我猜这里我们只想要一个简单的表达式

(?:<.*?)(:.*?:)(?:.+?>)

可以用我们想要的任何东西代替。

Demo

const regex = /(?:<.*?)(:.*?:)(?:.+?>)/gmi;
const str = `:fra: :fra: <:fra:12312312> <a:fra:!232131> :fra::fra:
Some text:fra: Hello:fra::fra::fra: :fra:`;
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}`);
    });
}

答案 1 :(得分:0)

对于您的示例数据,您可以匹配不需要的内容并捕获您想要的内容。您可以在括号之间至少包含:

<.*?:.*?>|(:\w+:)

Regex demo

或者,如果您不想在两者之间使用括号,则可以使用否定的字符类[^<>]来不匹配括号。

<[^<>]*:[^<>]*>|(:\w+:)
  • <匹配
  • [^<>]*否定的字符类,不匹配<或> 0+次
  • :匹配项:
  • [^<>]*否定的字符类,不匹配<或> 0+次
  • >匹配>字符
  • |
  • (:\w+:)在组1中捕获,它们之间匹配的1个以上单词字符:

Regex demo

const regex = /<[^<>]*:[^<>]*>|(:\w+:)/gm;
const str = `:fra: :fra: <:fra:12312312> <a:fra:!232131> :fra::fra:
Some text:fra: Hello:fra::fra::fra: :fra:`;
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++;
  }
  if (undefined !== m[1]) {
    console.log(m[1]);
  }
}

如果您想replace:fra:匹配new,则可以切换捕获组并使用带有回调的替换。

const regex = /(<[^<>]*:[^<>]*>)|:\w+:/gm;
let str = `:fra: :fra: <:fra:12312312> <a:fra:!232131> :fra::fra:
Some text:fra: Hello:fra::fra::fra: :fra:`;

str = str.replace(regex, function(m, g1) {
  return undefined === g1 ? "new" : m;

});
console.log(str);