如何将正则表达式匹配日期作为数字

时间:2013-06-10 15:05:01

标签: ruby regex

鉴于此字符串:

stuff = "banana 11/12/2009 123"

如何在ruby .scan调用中获取正则表达式只返回:

["123"]

在ruby中我使用了stuff.scan(/\b\d+\b/)但是意识到\ b边界将反斜杠视为边界,所以我从方法返回[“11”,“12”,“2009”,“123”] 。此外,我需要扫描处理以下内容,只返回“123”:

stuff = "123 banana 11/12/2009"
stuff = "11/12/2009 banana 123"

任何想法? :)

6 个答案:

答案 0 :(得分:2)

你可以使用这种模式:

/(?<=\s|^)\d+(?=\s|$)/

答案 1 :(得分:2)

您也可以使用:

(?<!\S)\d+(?!\S)

相当于(但略短):

(?<=\s|^)\d+(?=\s|$)

匹配\d+,其周围有空格,或字符串(或行)的开头/结尾。

答案 2 :(得分:2)

您还可以尝试更易读的分割/选择解决方案,该解决方案仅查找空格分隔文本部分中的数字。

stuff.split.select { |x| x =~ (/^\d+$/)}

答案 3 :(得分:1)

Negative lookahead/behind

(?<!/)\b\d+\b(?!/)

如果使用/作为分隔符

,则转义为Ruby
(?<!\/)\b\d+\b(?!\/)

演示:http://rubular.com/r/P9MjQ87csO

注意:如果您一直使用/正则表达式,那么我建议您考虑更改分隔符。根据{{​​3}},您可以这样做:

mystring =~ %r{(?<!/)\b\d+\b(?!/)}

再也不用担心向前斜线了。见this dailyvim post

答案 4 :(得分:1)

您需要在包含字符串的开头或结尾处使用独立的三位数字符串:

/(?:^\d{3}\b|\b\d{3}$)/

这是正则表达式的proof

答案 5 :(得分:0)

如何试图否定/?

stuff.scan(/[^\/]*\d[^\/]*/)