【问题标题】:How to find input date pattern is dash or slash or space in rubymine or ruby如何在 ruby​​mine 或 ruby​​ 中查找输入日期模式是破折号或斜线或空格
【发布时间】:2020-10-21 22:04:23
【问题描述】:

当输入日期为mm-dd-yyyymm/dd/yyyymm dd yyyy 时,根据我需要格式化自己的模式。如何查找输入日期是哪种模式?在 ruby​​/rubymine/watir 中。下面是红宝石黄瓜代码

Then(/^I see correct (.*) on the form$/) do |mdate|
  mdate1 = Date.strptime(mdate,"%m-%d-%Y").strftime("%a %b %d %Y 00:00:00 GMT+0000")
  puts "parsing output1 is #{mdate1}"

这里mdate 可以是上述任何模式,目前strptime 仅适用于一种模式。如果它需要为其他模式工作如何进行?

【问题讨论】:

  • 使用正则表达式模式!
  • 是这 3 种格式之一还是可以有更多/其他?
  • 顺便说一句,你到底需要什么来确定模式?格式化的日期字符串或<input type="date"> 标签或带有pattern 属性的输入?
  • @Stefan 只有那些模式。当我在变量中收到任何这些模式时,我使用该变量来格式化 strptime(date, ""%m-%d-%Y") 或 strptime(date, ""%m/%d/%Y" ) 或 strptime(date, ""%m %d %Y")。然后我再次使用 strftime 格式化以获得所需的输出
  • @Ganesh 听起来好像您已经找到了解决方案。也许你可以展示你当前的代码并解释你遇到的问题。 (连同例子)

标签: regex ruby rubymine


【解决方案1】:

正则表达式匹配和 case 语句

如果您的问题只是关于如何将您描述的数据与 Ruby 中的正则表达式进行匹配,您可以使用如下模式:

input_date =~ %r"\b\d{1,2}([-/ ])\d{1,2}\1\d{4}\b"

但是,匹配的有效性将取决于您的数据集的质量。有很多方法可能无法匹配或匹配非日期数据。您必须充分了解您的数据,才能制作一个有用但极简的正则表达式,它只匹配您想要的内容。

另一方面,如果您的问题是关于 哪个 模式匹配了,那么:

input_date =~ %r"\b\d{1,2}([-/ ])\d{1,2}\1\d{4}\b"

# print the format based on delimiter used
case input_date.scan(%r"[-/ ]").first
when "/" then p "mm/dd/yyyy"
when "-" then p "mm-dd-yyyy"
when " " then p "mm dd yyyy"
end

您可以根据需要调整操作,例如为Date#strptimeDateTime#strftime 定义模式、设置变量或调用一种或多种方法来制作或格式化您的日期对象。不过,这肯定会让您指向正确的方向。

【讨论】:

  • 感谢您的信息。如何在正则表达式中输入 2 位或 4 位数字的年份。目前,如果我给 6-5-20,它的打印为 6-5-0020。请告诉我
  • @Ganesh 你需要像%r"\b\d{1,2}([-/ ])\d{1,2}\1(\d{2}|\d{4})\b" 这样的东西来捕捉两位数或四位数的年份。不要使用\d{1,4},因为这也会匹配6-5-202之类的东西,这可能不是你想要的。
【解决方案2】:

通过将字符串与以下正则表达式匹配,分隔符将被保存到捕获组 1。

/(?<!\d)\d{2}([- \/])\d{2}\1\d{4}(?!=\d)/

Start your engine!

由于您将尝试将匹配的字符串转换为Date 对象,因此您会在那个时候发现它是否是一个有效的日期。因此,正则表达式无需将几个月的可能性限制为 01-12 或将天限制为 01-31; \d{2} 就足够了。

Ruby 的正则表达式引擎执行以下操作。

(?<!\d)   : use a negative lookbehind to assert the previous character
            is not a digit
\d{2}     : match 2 digits
([- \/])  : match a character in the character class and save to
            capture group 1
\d{2}     : match 2 digits
\1        : match the content of capture group 1
\d{4}     : match 4 digits
(?!=\d)   : use a negative lookahead to assert the next character
          : is not a digit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多