类似日期的字符串shell的正则表达式

时间:2016-04-07 17:28:43

标签: regex shell

我试图在shell中写一个正则表达式来表示类似日期的字符串,但我遇到了一些困难。它应格式化为dd.mm.yyyy,其中dd可以在0-99范围内,mm可以在0-99范围内,year不受限制< / p>

正则表达式应匹配:

Hello we should meet 5.2.2010 after lunch.
Can we do it on 35.5.1900?

正则表达式不应与这些匹配:

I'll be there 234.42.2010.
I'll come on Friday 4.2.20000. Maybe on 23.356.2011.
Can you play that with me on 4.2.?

到目前为止,我已经写过这个正则表达式,但它并不完全正确。

 grep -w "[0-99]\{1\}\.[0-99]\{1\}\.[0-9]\{4,\}"

感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

您的regex不正确。字符类具有预定义的选项,例如[0-9][A-Z][a-z],但您使用的是[0-99]。因此它会匹配来自[0-9]或数字9本身的任何数字。

正确的regex应为

[0-9]\{1,2\}\.[0-9]\{1,2\}\.[0-9]\{4\}

grep -w本身就是字边界。所以不需要\b。来自文档

  

仅选择包含整体匹配的行                 话。测试是匹配的子字符串必须是                 在行的开头,或前面是非单词                 组成性质。同样,它必须在最后                 该行或后跟非单词构成字符。                 单词构成字符是字母,数字和                 下划线。

您可以使用-P选项将扩展PCRE支持用作

grep -P -w "[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}"

答案 1 :(得分:1)

尝试:[^0-9][0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}[^0-9]

注意:您可能需要在两侧填充空格。

我建议使用修饰符,使您不必转义{ s(可能是-E)。

解释

  • [^0-9]非数字
  • [0-9]{1,2}\. 1位或2位数字和句号。
  • [0-9]{4}年份4位数

答案 2 :(得分:0)

这个怎么样?

>>> import re
>>> extract = lambda txt: re.findall(r"\b\d{1,2}\.\d{1,2}\.\d{4}\b", txt)
>>> print extract('Hello we should meet 5.2.2010 after lunch.')
['5.2.2010']
>>> print extract('Can we do it on 35.5.1900?')
['35.5.1900']
>>> print extract('Ill be there 234.42.2010.')
[]
>>> print extract('Ill come on Friday 4.2.20000. Maybe on 23.356.2011.')
[]
>>> print extract('Can you play that with me on 4.2.?')
[]