В качестве примера вы можете сопоставить то, что вам не нужно, и захватить то, что вы хотите.Вы можете заключить в скобки по крайней мере :
<.*?:.*?>|(:\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);