You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则分割非字符内容?原生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"]

这个正则的意思是在两种位置分割:

  1. 前面是字母,后面是非字母非数字的地方
  2. 前面是非字母非数字,后面是字母或数字的地方

不过说实话,这个写法可读性不如match(),所以更推荐第一种方法。


内容的提问来源于stack exchange,提问作者Tartarus13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:43:42