gpt4 book ai didi

javascript - 正则表达式:通过一次匹配捕获多个可选组

转载 作者:行者123 更新时间:2023-12-03 03:42:38 28 4
gpt4 key购买 nike

在 JavaScript 中,我正在寻找一个正则表达式来捕获字符串中的多个可选组。但至少应该存在一个组。

字符串:foo bar 12 秒 3 分钟 4h

到目前为止正则表达式:/(?:(\d+)\s?s(?:econds?)?)?(?:(\d+)\s?m(?:inutes?)?) ?(?:(\d+)\s?h(?:我们的?)?)?/gi

我需要捕获12秒3分钟4h,仅返回各自组中的数值。

这些时间单位可以存在,也可以互换。我的最终结果需要如下所示:

12s 3m //['12', '3', undefined]
10 seconds //['10', undefined, undefined]
4hours //[undefined, undefined, '4']
3 minutes //[undefined, '3', undefined]
1hour 54seconds 7minutes //['54', '7', '1']

undefined null 甚至是空字符串。只要它们在各自的索引中即可。

有什么简单的方法可以在不使用循环的情况下通过单个 execmatch 来处理此问题?

最佳答案

正如 Wiktor 正确指出的那样,无法使用单个正则表达式来做到这一点。这是一个实现 3-regex 解决方案的简单函数:

function get_time_parts(text) {
var s, m, h;
// Seconds part: Either "s", "sec", "secs" "second" or "seconds".
s = text.match(/\b(\d+)\s*s(?:ec(?:ond)?s?)?\b/i);
s = s ? s[1] : undefined;
// Minutes part: Either "m", "min", "mins" "minute" or "minutes".
m = text.match(/\b(\d+)\s*m(?:in(?:ute)?s?)?\b/i);
m = m ? m[1] : undefined;
// Hours part: Either "h", "hr", "hrs" "hour" or "hours".
h = text.match(/\b(\d+)\s*h(?:rs?|ours?)?\b/i);
h = h ? h[1] : undefined;
return (s || m || h) ? [s, m, h] : null;
}

如评论中所述,此函数允许以下时间部分变化:

秒部分:“s”、“sec”、“secs”、“秒”或“秒”。
分钟部分:“m”、“min”、“mins”“分钟”或“分钟”。
小时部分:“h”、“hr”、“hrs”、“hour”或“hours”。

正则表达式不区分大小写,因此允许变化,例如HR、Sec、mIN 等。如果这些部分都不存在,则函数返回 null。

关于javascript - 正则表达式:通过一次匹配捕获多个可选组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551375/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com