我正在尝试从字符串中获取除<:randomtext:123>
和<a:randomtext:123>
格外的所有:randomtext:模板,并用另一个字符串替换它们。我如何获得所有这些团体?
[^<](:\w+?:)
这是我的demo。
答案 0 :(得分:0)
我猜这里我们只想要一个简单的表达式
(?:<.*?)(:.*?:)(?:.+?>)
可以用我们想要的任何东西代替。
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+:)
或者,如果您不想在两者之间使用括号,则可以使用否定的字符类[^<>]
来不匹配括号。
<[^<>]*:[^<>]*>|(:\w+:)
<
匹配[^<>]*
否定的字符类,不匹配<或> 0+次:
匹配项:[^<>]*
否定的字符类,不匹配<或> 0+次>
匹配>字符|
或(:\w+:)
在组1中捕获,它们之间匹配的1个以上单词字符:
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);