Как получить группы, соответствующие шаблону, кроме особых случаев - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь получить все шаблоны: randomtext: из строки, кроме случаев <:randomtext:123> и <a:randomtext:123> и заменить их другой строкой.Как я могу получить все эти группы?

Попытка

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

Вот мое демо .

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

В качестве примера вы можете сопоставить то, что вам не нужно, и захватить то, что вы хотите.Вы можете заключить в скобки по крайней мере :

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

Regex demo

Или, если вы не хотите сопоставлять скобки между ними, выможет использовать класс отрицанных символов [^<>], чтобы не совпадать с открывающей или закрывающей скобкой.

<[^<>]*:[^<>]*>|(:\w+:)
  • < Match
  • [^<>]* Класс отрицательных символов, matchне <или> 0+ раз
  • : Совпадение:
  • [^<>]* Класс отрицательных символов, совпадение не <или> 0+ раз
  • > Совпадение>char
  • | Или
  • (:\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]);
  }
}

Если вы хотите заменить совпадения :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);
0 голосов
/ 18 июня 2019

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

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

было заменено всем, что мы хотим.

Демо

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}`);
    });
}
...