我试图在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,\}"
感谢您的帮助:)
答案 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.?')
[]