如何用正则分割非字符内容?原生JavaScript正则分割示例
如何用正则分割字符串,按非字母/数字分组并保留内容
嘿,针对你提出的两个问题(本质是同一个需求),我来给你一个清晰的解决方案——尤其是你给出的"wer%55"要拆成["wer","%","55"]这个例子,用原生JS结合正则就能轻松实现。
最直观的方法:用match()匹配所有连续同类组
其实比起split(),用String.prototype.match()来直接抓取所有符合要求的分组会更简单,不需要纠结分割点的问题。我们可以写一个正则,匹配三种连续的字符组:
- 一串大小写字母:
[a-zA-Z]+ - 一串数字:
\d+ - 单个非字母非数字的字符:
[^a-zA-Z\d]
把这些用|组合起来,加上全局匹配标志g,就能一次性拿到所有分组。
代码示例:
const src = "wer%55"; const result = src.match(/[a-zA-Z]+|\d+|[^a-zA-Z\d]/g); console.log(result); // 输出: ["wer", "%", "55"]
为什么这个正则管用?
让我拆解一下:
[a-zA-Z]+:匹配1个及以上的大小写字母,对应例子里的"wer"\d+:匹配1个及以上的数字,对应例子里的"55"[^a-zA-Z\d]:匹配任意一个不是字母也不是数字的字符,对应例子里的"%"g:全局匹配标志,确保不会只匹配第一个符合的分组,而是遍历整个字符串
如果一定要用split()实现
要是你坚持想用split()方法,那得利用正则的正向预查和反向预查来定位分割的位置,同时保留分隔符。对应的正则会稍微复杂一点,但也能实现需求:
const src = "wer%55"; const result = src.split(/(?<=[a-zA-Z])(?=[^a-zA-Z\d])|(?<=[^a-zA-Z\d])(?=[a-zA-Z\d])/); console.log(result); // 同样输出: ["wer", "%", "55"]
这个正则的意思是在两种位置分割:
- 前面是字母,后面是非字母非数字的地方
- 前面是非字母非数字,后面是字母或数字的地方
不过说实话,这个写法可读性不如match(),所以更推荐第一种方法。
内容的提问来源于stack exchange,提问作者Tartarus13
相关产品推荐
相关产品推荐

