问个正则表达式的问题

为当前最终发行版之前的所有版本提供支持
回复
蛋壳羊
帖子: 113
注册时间: 2006-11-04 19:56
送出感谢: 0
接收感谢: 0

问个正则表达式的问题

#1

帖子 蛋壳羊 » 2007-06-24 9:03

我想把一个数据中的所有日期,格式为20070624
按五天为一个周期分段,并修改
比如说把20070624修改为20070620,20070626修改为20070630
应该怎么写呢

thx : :D
头像
aqua203
帖子: 283
注册时间: 2007-03-01 21:04
来自: 福建
送出感谢: 0
接收感谢: 0

#2

帖子 aqua203 » 2007-06-24 9:17

一定要正则表达式吗?按整数来处理,用一个if判断就可以了,或者用mod(取模)来计算。
2007???[0-4]
2007???[5-9]
上次由 aqua203 在 2007-06-24 9:20,总共编辑 1 次。
Feisty/Athlon1800+/512M/80G/MX440/SIS746
Linux 不是Windows
www.pendriverlinux.com
www.puppyos.com
sqlfm
帖子: 356
注册时间: 2007-02-15 6:26
送出感谢: 0
接收感谢: 1 次

#3

帖子 sqlfm » 2007-06-24 9:19

20070624 -> 20070620
20070626 -> 20070630 ?

例子不够详细,请问:
20070601 -> ?
20070605 -> ?
20070610 -> ?
20070625 -> ?
20070630 -> ?

MySQL :
concat(substr(date,1,6), floor(substr(date,7) / 5) ) ?

PHP
substr($date,0,6) . floor(substr($date,6) / 5) ?
2007:琉璃地,旃檀林。心心作。念念是。
蛋壳羊
帖子: 113
注册时间: 2006-11-04 19:56
送出感谢: 0
接收感谢: 0

#4

帖子 蛋壳羊 » 2007-06-24 9:34

补充一下
结尾日期
[0-4]-》5
[11-14]-》15
[21-24]-》25
[6-9]-》10
[16-19]-》20
[26-29]-》下个月1号
sqlfm
帖子: 356
注册时间: 2007-02-15 6:26
送出感谢: 0
接收感谢: 1 次

#5

帖子 sqlfm » 2007-06-24 9:40

小孩:不要太懒。
这个是初一数学吧。
学会自己解决。

至于编程语句:2/3楼均可。
2007:琉璃地,旃檀林。心心作。念念是。
头像
冲浪板
论坛版主
帖子: 7466
注册时间: 2007-05-06 8:19
送出感谢: 0
接收感谢: 5 次

#6

帖子 冲浪板 » 2007-06-24 9:58

人家问的是正则表达式(的问题),不是问如何解决计算问题。

鄙视那种回答不了问题,但是另出主意(改方案)的人;就是出主意也要加个“btw”才好啊。
ltkun
帖子: 1335
注册时间: 2006-01-10 19:09
送出感谢: 0
接收感谢: 0

#7

帖子 ltkun » 2007-06-24 10:02

搞笑来 这么简单的问题自己实现不是更好 授人与鱼不如授人与渔
蛋壳羊
帖子: 113
注册时间: 2006-11-04 19:56
送出感谢: 0
接收感谢: 0

#8

帖子 蛋壳羊 » 2007-06-24 10:11

我只是想问下正则表达使怎么写。。。
sqlfm
帖子: 356
注册时间: 2007-02-15 6:26
送出感谢: 0
接收感谢: 1 次

#9

帖子 sqlfm » 2007-06-24 14:05

人家问的是正则表达式(的问题),不是问如何解决计算问题。
鄙视那种回答不了问题,但是另出主意(改方案)的人;就是出主意也要加个“btw”才好啊。
你没有骂我吧?我是常常不知“已经被人骂”的人了。如果恼了您,我诚心检讨,态度真的是:认真的哦!

1。本人没有上过中文的“电脑课”。所以不明白“正则表达”为何物啦。
2。楼主未说明:用何种“程式语言“表达。

所以,我们只能说说大概的拉。

另外: "btw" 是什么?不过不要紧,世界上几乎所有的事情,俺多不明白的。
php function: 苯方法:
function d2d($str)
{
$ym = substr($str,0,6);
$dd = substr($str,6,2)+0;
if ($dd<6) return $ym."05";
if ($dd<11) return $ym."10";
if ($dd<16) return $ym."15";
if ($dd<21) return $ym."20";
if ($dd<26) return $ym."25";
$next_month = strtotime("+10 day",mktime(0,0,0,substr($ym,4),1,substr($ym,0,4)));
return date("Ym",$next_month)."01";
}
MySQL:
update your_table set datecol =
if(substring(datecol,7,2)<6,concat(substring(datecol,1,6),'05'),
if (substring(datecol,7,2)<11,concat(substring(datecol,1,6),'10'),
if (substring(datecol,7,2)<16,concat(substring(datecol,1,6),'15'),
if (substring(datecol,7,2)<21,concat(substring(datecol,1,6),'20'),
if (substring(datecol,7,2)<26,concat(substring(datecol,1,6),'25'),
date_format(date_add(datecol,interval 10 days),'%Y%m01')
))))
不知可用否?
2007:琉璃地,旃檀林。心心作。念念是。
头像
arli
帖子: 194
注册时间: 2006-11-24 11:00
来自: 太阳系第3行星
送出感谢: 0
接收感谢: 0
联系:

#10

帖子 arli » 2007-06-24 14:12

蛋壳羊 写了:我只是想问下正则表达使怎么写。。。
这个有判段性的,用正则做不到

正则是一种用来代替描述范围或语法规则的表示法,并不是什么程序代码,它没有逻辑性(无可推理)和计算能力(没有任何数值计算)。。
通俗点说,正则是告诉操作方符合条件的范围。。
强制性的执行就只能是 [0-4]、[11-14] 这样分组,因为上面说过它不具计算能力

非要用程序算法,逻辑上就是

对日期增加(mysql: date_add / mssql: dateadd)一个差数,其差数就从 5- 数%5 计算出(数%5 表示 数/5 的余数)

上面说的只是一个设计时算法
因为楼主的这种复杂情况是不具逻辑性的,因为还有逻辑外的31号 怎么办 2月的28号 怎么办

所以正常情况下,在项目设计时,是将该日期转为数字型(原理上是从某个日期开始经过了多少天),然后 (数+5-1)/5 取整*5 来实现每5一分类 <- 这个算法其实就是”奸商“用的0舍5入法
要爱护linux 就象爱护我们的庄稼地一样
蛋壳羊
帖子: 113
注册时间: 2006-11-04 19:56
送出感谢: 0
接收感谢: 0

#11

帖子 蛋壳羊 » 2007-06-24 21:57

正在做数学建模的东西
文本文档里的数据很不好处理
以前只是知道一点正则表达式在这方面很强,所以就想能不能用正则表达式来解决
听了arll的解释现在清晰多了

下午的时候已经用C作出来了:)

谢谢大家

特别是arll的耐心讲解,对正则表达式总算有了一个正确的概念

也谢谢sqlfm,从你的回帖能看出来你是一个很有性格也很好的人,呵呵
回复

回到 “老旧版本支持”