You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript中如何用正则完整分词并匹配所有时间单元?

解决正则匹配多个时间单元的问题

当然可以用正则实现你的需求!你遇到的问题核心是重复捕获组只会保留最后一次匹配结果——原来的正则把整个时间单元放在一个重复的捕获组里,正则引擎只会记住最后一次迭代的内容。下面是具体的解决思路和实现方案:

1. 调整正则表达式结构

我们需要把正则改成全局匹配每个独立的时间单元,而不是用一个重复的捕获组包裹整个字符串。推荐的正则表达式如下:

/([1-9]\d*)(y|m|w|d|h|min|s)/g
  • ([1-9]\d*):捕获非零开头的数字,避免0y这种无效格式
  • (y|m|w|d|h|min|s):捕获你需要的所有时间单位类型
  • g:全局匹配标志,让正则遍历整个字符串,找出所有符合条件的时间单元

2. 提取匹配结果并构建timeModule字典

JavaScript 示例

const timeStr = '12y12m12w12d12h12min12s';
const timeRegex = /([1-9]\d*)(y|m|w|d|h|min|s)/g;
const timeModule = {};

let matchResult;
// 循环遍历所有匹配项
while ((matchResult = timeRegex.exec(timeStr)) !== null) {
  const value = parseInt(matchResult[1], 10);
  const unit = matchResult[2];
  timeModule[unit] = value;
}

console.log(timeModule);
// 输出:{ y: 12, m: 12, w: 12, d: 12, h: 12, min: 12, s: 12 }

Python 示例

import re

time_str = '12y12m12w12d12h12min12s'
time_regex = re.compile(r'([1-9]\d*)(y|m|w|d|h|min|s)')
# findall 返回所有匹配的(数字, 单位)元组列表
matches = time_regex.findall(time_str)

time_module = {unit: int(value) for value, unit in matches}
print(time_module)
# 输出:{'y': 12, 'm': 12, 'w': 12, 'd': 12, 'h': 12, 'min': 12, 's': 12}

3. 可选:验证整个字符串的合法性

如果你需要确保输入字符串完全由合法时间单元组成(没有多余字符),可以先做一次全字符串验证:

/^([1-9]\d*(y|m|w|d|h|min|s))+$/

用这个正则测试输入字符串,匹配成功后再用全局正则提取具体单元,能避免处理包含非法内容的输入。


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

火山引擎 最新活动