正则表达式查找唯一单词

3

我正在尝试在JavaScript中解析字符串,并找到所有以:符号开头的唯一单词。我为此编写了正则表达式:

/(:[A-z]\w+)(?!.*\1)/g

对于这个字符串,它可以正常工作:

"test :one :one test :one test :two".match(/(:[A-z]\w+)(?!.*\1)/g)

结果是 [':one', ':two'] 在线示例#1

但是,如果单词后面有换行符

"test :one\n :one test :one test :two".match(/(:[A-z]\w+)(?!.*\1)/ig)

正则表达式不能正常工作,返回[':one', ':one', ':two']在线示例#2

如何修改此正则表达式以获取唯一结果?


1
[A-z][A-Z] - Tushar
@Tushar,谢谢,我会修复这个问题。 - Javasick
1个回答

3
你需要使用[\s\S]而不是.来确保检查可以一直到字符串的结尾(而不仅仅是行),并且使用[a-zA-Z]而不是[A-z](参见为什么这个正则表达式允许一个插入符号?):
/(:[a-z]\w+)(?![\s\S]*\1)/gi

看看这个正则表达式演示

var re = /(:[a-z]\w+)(?![\s\S]*\1)/gi; 
var str = 'test :one\n :one test :one test :two';
console.log(str.match(re));
//or, get rid of the inital :
console.log(str.match(re).map(function(x){return x.substr(1);}));


1
以防万一:我添加了另一行代码,以便去除初始的 :,如果需要的话。当然,可以使用内部捕获组完成此操作,然后使用 RegExp#exec 迭代匹配项,但为什么不重用您的代码呢? - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接