如何匹配仅由单个特殊字符(星号)组成的子串?
解决纯星号子串的正则匹配问题
问题背景
给定字符串:
const str = "he**o *ow ar* you ***** ***?"
需要匹配其中仅由星号组成的连续子串,预期结果:
const output = ["*****", "***"]
原尝试使用正则 /\b\*+\b/g,但因星号不属于单词字符,\b(单词边界)无法生效,导致匹配失败。
解决方案
使用环视断言准确定位纯星号子串的边界,正确正则如下:
const regex = /(?<!\*)\*+(?!\*)/g;
正则解释
(?<!\*):负向后行断言,确保当前匹配的星号前面不是星号(或处于字符串起始位置)\*+:匹配1个或多个连续的星号(?!\*):负向前行断言,确保当前匹配的星号后面不是星号(或处于字符串结束位置)
代码验证
const str = "he**o *ow ar* you ***** ***?"; const regex = /(?<!\*)\*+(?!\*)/g; const output = str.match(regex); console.log(output); // 输出 ["*****", "***"]
原正则失效原因
\b 是单词边界,仅匹配单词字符(字母、数字、下划线)与非单词字符之间的位置。星号属于非单词字符,它和空格、问号等其他非单词字符之间不会触发\b,因此无法正确界定纯星号子串的边界。
内容的提问来源于stack exchange,提问作者boolie29
相关产品推荐
相关产品推荐

