Javascript中如何用正则拆分含#标签的字符串为指定格式数组
原有两种split方案的问题
- 调用
string.split(/(?=#)/g)的实现:正则仅匹配#字符前面的零宽位置,没有针对「标签结束后连接普通文本的空白区域」设置切分规则,会把字符串开头的#标签和后续所有普通文本黏连为同一片段,最终输出不符合预期的长内容。 - 调用
string.split(/(?:^|[ ])#([a-zA-Z]+)/g)的实现:JS的split方法有固定规则——如果正则带有捕获分组,所有分组捕获到的内容都会被插入最终的结果数组;同时这个正则直接匹配#和标签文本本身,而非在文本边界位置做切分,因此会产生多余空串、孤立标签文本这类杂项内容。
简洁实现方案
通过两个零宽断言定义切分边界,不需要额外的后处理代码,即可得到目标格式的结果:
var string = "#developers must split #hashtags"; // 仅在标签与普通文本的连接空白处做切分 var description = string.split(/(?<=#\S+)\s+|\s+(?=#)/g);
执行上述代码后,description的输出完全匹配要求:["#developers", "must split", "#hashtags"]
正则逻辑说明
(?<=#\S+)\s+:匹配紧跟在#开头非空白标签后面的连续空白字符,在该位置切分,实现标签与后续普通文本的拆分\s+(?=#):匹配紧跟在#开头标签前面的连续空白字符,在该位置切分,实现普通文本与前序标签的拆分
两个切分规则都是通过零宽断言匹配位置,不会消费标签或普通文本的核心内容,且没有使用捕获分组,split过程不会插入多余内容。
如果需要兼容不支持后行断言的老旧环境,可以改用match的匹配方案实现同等效果:
var description = string.match(/#\S+|[^\s#][^#]*(?=\s#|$)/g).filter(Boolean);
内容的提问来源于stack exchange,提问作者Klodian
相关产品推荐
相关产品推荐

