Angular 2中如何修改正则以匹配字符串内以$开头的单词?
嘿,这个问题很好解决,核心就是要处理正则里的特殊字符~
你原来的正则能匹配#开头的单词,是因为#在正则里不属于特殊元字符,直接写就行,但$不一样——它在正则里是用来表示行末尾位置的特殊符号,所以直接把#换成$的话,正则会把它当成行尾来解析,自然匹配不到你想要的内容。
只需要把$转义成\$,让正则把它当作普通的美元符号字符处理就行,修改后的代码如下:
var s = "$hello, this is a $test $john #doe"; var re = /(?:^|\W)\$(\w+)(?!\w)/g; // 将原正则中的#替换为\$ var match, matches = []; while (match = re.exec(s)) { matches.push(match[1]); } console.log(matches); // 输出结果:["hello", "test", "john"]
我再给你拆解下这个正则的关键部分,方便你理解:
(?:^|\W):匹配字符串的开头,或者非单词字符(确保$前面不会是其他单词字符,比如不会匹配abc$def这种夹在中间的$)\$:转义后的美元符号,告诉正则这是一个普通字符,不是行尾标记(\w+):捕获$后面的所有单词字符(字母、数字、下划线),这就是我们要提取的目标内容(?!\w):负向预查,确保$后面的单词结束后没有其他单词字符(比如不会把$john123错误拆分成john和123)
如果之后你想同时匹配#和$开头的单词,也可以把正则改成这样,一次搞定:
var re = /(?:^|\W)([#\$])(\w+)(?!\w)/g; // 此时matches里会同时拿到符号和对应的单词,比如["$", "hello", "$", "test", "#", "doe"]
内容的提问来源于stack exchange,提问作者Aarsh
相关产品推荐
相关产品推荐

