JavaScript如何提取字符串中被|包裹的子串并返回指定格式数组
提取|包裹子串的最优实现方案
这种固定边界的字符串提取场景,最优方案是用正则表达式匹配,底层正则引擎做过优化,比手动遍历字符串拆分的执行效率更高,代码也更简洁易维护。
核心匹配逻辑:匹配两个|符号之间的、不包含|的非空内容,有两种常用写法:
- 捕获组写法:正则为
\|([^|]+)\|,匹配后提取第一个捕获组的内容即可,兼容性最好,所有支持正则的语言都可以用 - 零宽断言写法:正则为
(?<=\|)[^|]+(?=\|),可以直接匹配到目标内容,不需要额外提取捕获组,代码更简洁,需要语言正则引擎支持零宽断言
下面是不同常用语言的实现示例:
JavaScript 实现
const inputStr = "|hello| + |world| / |again|"; // 兼容所有JS环境的写法 const res1 = [...inputStr.matchAll(/\|([^|]+)\|/g)].map(item => item[1]); // 支持ES2018+的环境可以用零宽断言写法 const res2 = inputStr.match(/(?<=\|)[^|]+(?=\|)/g); // 输出结果:["hello", "world", "again"]
Python 实现
import re input_str = "|hello| + |world| / |again|" // 捕获组写法 res1 = re.findall(r'\|([^|]+)\|', input_str) // 零宽断言写法 res2 = re.findall(r'(?<=\|)[^|]+(?=\|)', input_str) // 输出结果:['hello', 'world', 'again']
如果业务场景中允许子串内部出现转义的\|,只需要把正则里的[^|]+替换为(?:\\.|[^|])+即可适配。
内容的提问来源于stack exchange,提问作者zedge
相关产品推荐
相关产品推荐

