如何解决“计时器”句型的正则表达式捕获组
我正在尝试编写一个正则表达式,它允许我解析和修改可能包含对特定动作计时的指令的字符串,使用捕获组来识别输入中的“小时”、“分钟”和“秒”值字符串。
在 ruby 中,我有一个接近我需要的匹配和捕获组的正则表达式
(?<hour_digit>\d+\s)[a-z]*\s?hour[s\b|b\s]|(?<minute_digit>\d+\s)[a-z]*\s?minute[s\b|b\s][a-z]*|(?<second_digit>\d+\s)[a-z]*\s?second[s\b|b]
我想找到一个表达式,它可以捕获可以匹配多个值的字符串,而不是独立的; “5 小时 15 分钟”应为一场比赛,“30 分钟至 1 小时”应为一场比赛。 视觉上当前正则表达式的匹配是这样的:
解决方法
你可以使用
(?<!\w)\b(?:(?<hour_digit>\d+)(?:\s*(?:more|another))?\s*hours?)?(?:(?:\s*(?:or|up to|and|to))*\s*(?<minute_digit>\d+)(?:\s*(?:more|another))?\s*minutes?)?(?:(?:\s*(?:or|up to|and|to))*\s*(?<second_digit>\d+)(?:\s*(?:more|another))?\s*seconds?)?\b(?!\w)
参见regex demo。 详情:
-
(?<!\w)\b
- 左侧词边界([[:<:]]
或\<
或\m
在某些风格中是这样做的) -
(?:(?<hour_digit>\d+)(?:\s*(?:more|another))?\s*hours?)?
- 可选出现-
(?<hour_digit>\d+)
- 组“hour_digit”:一位或多位数字 -
(?:\s*(?:more|another))?
- 可选出现零个或多个空格,然后是more
或another
字 -
\s*hours?
- 零个或多个空格,hour
或hours
-
-
(?:(?:\s*(?:or|up to|and|to))*\s*(?<minute_digit>\d+)(?:\s*(?:more|another))?\s*minutes?)?
- 可选出现-
(?:\s*(?:or|up to|and|to))*
- 零个或多个零个或多个空格后跟or
、up
、up to
、and
字 -
\s*
- 零个或多个空格 -
(?<minute_digit>\d+)
- 组“minute_digit”:一位或多位数字 -
(?:\s*(?:more|another))?
- 可选出现零个或多个空格,然后是more
或another
字 -
\s*minutes?
- 零个或多个空格,minute
或minutes
-
-
(?:(?:\s*(?:or|up to|and|to))*(?<second_digit>\d+)(?:\s*(?:more|another))?\s*seconds?)?
- 可选出现-
(?:\s*(?:or|up to|and|to))*
- 零个或多个零个或多个空格后跟or
、up
、up to
、and
字 -
\s*
- 零个或多个空格 -
(?<second_digit>\d+)
- 组“second_digit”:一位或多位数字 -
(?:\s*(?:more|another))?
- 可选出现零个或多个空格,然后是more
或another
字 -
\s*seconds?
- 零个或多个空格,second
或seconds
-
-
\b(?!\w)
- 右侧词边界(在其他一些正则表达式中,它是\M
、\>
或[[:>:]]
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。