【问题标题】:Ruby Regular Expression String Matching t =~ /^\d{2}(:\d{2}){2}$/ [duplicate]Ruby 正则表达式字符串匹配 t =~ /^\d{2}(:\d{2}){2}$/ [重复]
【发布时间】:2017-07-06 10:13:07
【问题描述】:

我从代码挑战中发现了这一点:

def time_correct(t)  
  return unless t =~ /^\d{2}(:\d{2}){2}$/
end

它用于找出是否例如"0;:44:07" 是否为常规时间字符串 ("HH:MM:SS")。 我不明白正则表达式。有人可以向我解释/^\d{2}(:\d{2}){2}$/吗?谢谢!

【问题讨论】:

  • regex101.com 是学习和理解正则表达式的好资源。见this。检查右上角的解释部分。
  • 除了正则表达式之外,这个方法还能返回nil以外的任何东西吗?请注意,正则表达式匹配 '99:99:99',即使那不是有效时间。您提到的“代码挑战”的 URL 是什么?
  • def time_correct(t) return t if t.nil? || t.empty? return unless t =~ /^\d{2}(:\d{2}){2}$/ t = t.split(":").map(&:to_i) Time.at(t[0] * 3600 + t[1] * 60 + t[2]).strftime "%H:%M:%S" end 这是完整的代码。我只是复制并粘贴了我不完全理解的行。

标签: ruby regex string string-matching


【解决方案1】:

/^\d{2}(:\d{2}){2}$/:

  1. /.../ 分隔正则表达式。
  2. ^ 匹配行的开头,如果在多行模式下,否则匹配字符串的开头。
  3. \d 匹配一位数
  4. {2} 声明前面的语句 \d 必须匹配 2 次。
  5. (...) 分隔捕获组。它将事物组合在一起作为通常的数学括号概念,还允许您稍后使用\i 引用它们,其中i 是组的索引。例如,(a)(b),a 是第 1 组,b 是第 2 组。
  6. \d{2} 刚刚解释了34 的步骤。
  7. {2} 与步骤4 相同,但这里前面是捕获组(:\d{2}),也必须重复2 次。
  8. $ 匹配行尾,如果在多行模式下,否则匹配字符串的结尾。

如果启用了多行模式,则您的表达式仅匹配以下内容:

22:33:44
02:33:44

但不像

22:33:44 d
d 22:33:44
f 02:33:44 f

如果未启用多行,则您的表达式仅匹配包含以下有效表达式的字符串:

22:33:44

但没什么,在一个有两个有效行的字符串上:

22:33:44
02:33:44

这是一个实时测试链接:https://regex101.com/r/cdSdt4/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2017-08-22
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2012-05-04
    • 2020-03-26
    相关资源
    最近更新 更多