当前位置: 技术问答>linux和unix
急,用正则表达式匹配日期的问题??万分感谢!
来源: 互联网 发布时间:2016-03-27
本文导语: 小弟在用C++写一个能够提取出url和文本中包含的日期的程序,但是使用正则表达式总也匹配不出满意的结果。 由于日期形式多种多样,现在用 “[0-9]\{4\}[^0-9]\{0,3\}[0-9]\{2\}[^0-9]\{0,3\}[0-9]\{2\}[^0-9]” 能够匹配出类似 20...
小弟在用C++写一个能够提取出url和文本中包含的日期的程序,但是使用正则表达式总也匹配不出满意的结果。
由于日期形式多种多样,现在用
“[0-9]\{4\}[^0-9]\{0,3\}[0-9]\{2\}[^0-9]\{0,3\}[0-9]\{2\}[^0-9]”
能够匹配出类似 20080619,2008-06-19,2008年06月19日 等几种比较标准的形式,但是像 080619, 2008619, 08619,2008-6-19等这种不是很标准的形式就无法匹配了,不知道哪位达人能指点一下,万分感谢!
由于日期形式多种多样,现在用
“[0-9]\{4\}[^0-9]\{0,3\}[0-9]\{2\}[^0-9]\{0,3\}[0-9]\{2\}[^0-9]”
能够匹配出类似 20080619,2008-06-19,2008年06月19日 等几种比较标准的形式,但是像 080619, 2008619, 08619,2008-6-19等这种不是很标准的形式就无法匹配了,不知道哪位达人能指点一下,万分感谢!
|
#!/bin/sh
format_date () {
# check argument
[ -z $1 ] && echo "usage: format_date " && return
line="$@"
# format line
echo $line
line=$(echo $line | sed 's/[^0-9]+/ /g')
echo $line
line=$(echo $line | sed 's/ ([0-9]) / 01 /g')
echo $line
line=$(echo $line | sed 's/^([0-9]) /01 /g')
echo $line
line=$(echo $line | sed 's/ ([0-9])$/ 01/g')
echo $line
line=$(echo $line | sed 's/ +//g')
echo $line
length=$(echo -n $line | wc -c)
if [ $length -eq 8 ] ; then
# format YYYY-MM-DD 00:00:00
year=$(echo $line | cut -c 1-4)
month=$(echo $line | cut -c 5-6)
day=$(echo $line | cut -c 7-8)
echo "$year-$month-$day 00:00:00"
elif [ $length -eq 14 ] ; then
# format YYYY-MM-DD HH:MM:SS
year=$(echo $line | cut -c 1-4)
month=$(echo $line | cut -c 5-6)
day=$(echo $line | cut -c 7-8)
hour=$(echo $line | cut -c 9-10)
min=$(echo $line | cut -c 11-12)
second=$(echo $line | cut -c 13-14)
echo "$year-$month-$day $hour:$min:$second"
else
echo "Invalid date string: $@"
fi
}
format_date 2008/2/5
format_date 2008/02/25
format_date 2008/2/25 22:33:44
format_date 2008/2/25 22:3:4
format_date 20080225
format_date 20080225223344
前段时间别人写的,可以参考一下。
format_date () {
# check argument
[ -z $1 ] && echo "usage: format_date " && return
line="$@"
# format line
echo $line
line=$(echo $line | sed 's/[^0-9]+/ /g')
echo $line
line=$(echo $line | sed 's/ ([0-9]) / 01 /g')
echo $line
line=$(echo $line | sed 's/^([0-9]) /01 /g')
echo $line
line=$(echo $line | sed 's/ ([0-9])$/ 01/g')
echo $line
line=$(echo $line | sed 's/ +//g')
echo $line
length=$(echo -n $line | wc -c)
if [ $length -eq 8 ] ; then
# format YYYY-MM-DD 00:00:00
year=$(echo $line | cut -c 1-4)
month=$(echo $line | cut -c 5-6)
day=$(echo $line | cut -c 7-8)
echo "$year-$month-$day 00:00:00"
elif [ $length -eq 14 ] ; then
# format YYYY-MM-DD HH:MM:SS
year=$(echo $line | cut -c 1-4)
month=$(echo $line | cut -c 5-6)
day=$(echo $line | cut -c 7-8)
hour=$(echo $line | cut -c 9-10)
min=$(echo $line | cut -c 11-12)
second=$(echo $line | cut -c 13-14)
echo "$year-$month-$day $hour:$min:$second"
else
echo "Invalid date string: $@"
fi
}
format_date 2008/2/5
format_date 2008/02/25
format_date 2008/2/25 22:33:44
format_date 2008/2/25 22:3:4
format_date 20080225
format_date 20080225223344
前段时间别人写的,可以参考一下。
|
08619
对应可能产成歧义的,不大好办。
比如08111
你解释成1月11号呢,还是11月1号?
对应可能产成歧义的,不大好办。
比如08111
你解释成1月11号呢,还是11月1号?
|
对于可能有歧义的地方,不需要匹配。
|