"timer" 句型的正则表达式捕获组

Regex capture groups for "timer" sentence pattern

我正在尝试编写一个正则表达式,使我能够解析和修改可能包含为特定操作计时的指令的字符串,使用捕获组来识别“小时”、“分钟”和“秒”值输入字符串。

在 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))? - 可选出现零个或多个空格,然后是 moreanother word
    • \s*hours? - 零个或多个空格,hourhours
  • (?:(?:\s*(?:or|up to|and|to))*\s*(?<minute_digit>\d+)(?:\s*(?:more|another))?\s*minutes?)? - 可选的出现
    • (?:\s*(?:or|up to|and|to))* - 出现零个或多个空格,后跟 orupup toand 个单词
    • \s* - 零个或多个空格
    • (?<minute_digit>\d+) - 组“minute_digit”:一个或多个数字
    • (?:\s*(?:more|another))? - 可选出现零个或多个空格,然后是 moreanother word
    • \s*minutes? - 零个或多个空格,minuteminutes
  • (?:(?:\s*(?:or|up to|and|to))*(?<second_digit>\d+)(?:\s*(?:more|another))?\s*seconds?)?- 可选出现
    • (?:\s*(?:or|up to|and|to))* - 出现零个或多个空格,后跟 orupup toand 个单词
    • \s* - 零个或多个空格
    • (?<second_digit>\d+) - 组“second_digit”:一个或多个数字
    • (?:\s*(?:more|another))? - 可选出现零个或多个空格,然后是 moreanother word
    • \s*seconds? - 零个或多个空格,secondseconds
  • \b(?!\w) - 右侧单词边界(在其他一些正则表达式中,它是 \M\>[[:>:]])。