我有一个字符串格式的数组。使用Javascript,如何用最少的代码替换[
,]
,<Tag:
和>
:
let s = "[<Tag: cats>, <Tag: dogs>, <Tag: parakeets>]"
最终结果应该如下所示:
"cats, dogs, parakeets"
这似乎工作,但它是相当…不是很好。
s.replace(/^[/, '').replace(/]$/, '').replaceAll('<Tag: ', '').replaceAll('>', '')
是否有一个聪明的方法来做到这一点与RegEx?
匹配<Tag:
然后捕获非>
字符看起来就像你想要的那样:
const s = "[<Tag: cats>, <Tag: dogs>, <Tag: parakeets>]";
const result = s.replace(/<Tag: ([^>]+)>/g, '$1').replace(/[[]]/g, '');
console.log(result);
另一种方法,匹配而不是替换:
const s = "[<Tag: cats>, <Tag: dogs>, <Tag: parakeets>]";
const result = [...s.matchAll(/<Tag: ([^>]+)>/g)]
.map(match => match[1])
.join(', ');
console.log(result);
我建议匹配所有子字符串并将它们连接起来:
const result = [...s.matchAll(/<Tag:s*(w+)>/g)]
.map(
([, m]) => m
)
.join(', ');
// result: "cats, dogs, parakeets"
当lookbehind中支持无限量词时,您可以匹配<Tag:
和>
之间的所有值,并确保所有匹配都在方括号之间。
查看这个正则表达式演示中的正则表达式匹配。
let s = "[<Tag: cats>, <Tag: dogs>, <Tag: parakeets>]"
const regex = /(?<=[[^][]*<Tag: )w+(?=>[^][]*])/g;
console.log(s.match(regex).join(", "));
这个怎么样?删除分隔符[
、]
、>
和<Tag:
部分:
let s = "[<Tag: cats>, <Tag: dogs>, <Tag: parakeets>]";
s = s.replace(/[[]>]|<.*? /g, "");
console.log(s);
不使用正则表达式,但它确实返回相同的结果。
let res = ""
let s = "[<Tag: cats>, <Tag: dogs>, <Tag: parakeets>]"
for ( let i = 0; i < s.length; i++){
let c = s[i]
if ( c == '[' || c == ']' || c == '>')
continue
else if ( s.substr(i,5) == '<Tag:')
i += 5
else
res += c
}
return res