提取在Regex中匹配且以空格为界的子字符串

时间:2014-09-17 21:42:04

标签: mysql regex

尝试解析以各种方式和上下文输入的日期,以及可能存在或不存在于给定记录中的日期

我可以用

选择候选行
SELECT * FROM table WHERE column REGEXP '[-|.|/][0-9][0-9][-|.|/]' ;

这确实会选择读取类似

的记录
I was on top of mount Everest (2010-10-10)
i went to see the doctor on 13/12/10 and she told me I was in great shape.

其中匹配值分别为第一和第二记录的-10-和/ 12 /。

现在,我想从列中提取日期。不仅是-10-或/ 12 /而是完整日期片段2010-10-10或13/12/10,即匹配的表达式向后扩展到空格或括号,并在括号空间处向前扩展。

很抱歉,如果这很明显 - 我不熟悉REGEX。

3 个答案:

答案 0 :(得分:0)

您必须找到日期输入的模式。你可以在你的地方使用正则表达式,但你需要以某种方式隔离它。它始终是col的最后一部分吗?

现在你隔离了这个位置,你可以做一个案例样式选择

选择案例 当右(日期,4)在1900和2200之间然后右(日期,10)#mm / dd / yyyy 当离开(日期,4)在1900和2200之间然后是concantenate(左(右(日期,5),2),“/”,右(日期,2)) 以日期结束

那种折磨

EDIT ;;

SET @fieldName =“我登上珠穆朗玛峰(2010-10-22)”;

SELECT IF( STR_TO_DATE( CONCAT(  右(SUBSTRING_INDEX(@ fieldName,“ - ”,1),4),“ - ”,右(SUBSTRING_INDEX(@ fieldName,“ - ”,2),2),“ - ”,LEFT(SUBSTRING_INDEX(@ fieldName,“ - ”, - 1),2)  ),'%Y-%m-%d'  )IS NULL,

“糟糕的约会”,

“好日子”)

但是现在对于糟糕的约会和好日期,你继续将这种风格链接到所有日期变体......

虽然最好的解决方案是如果您输入的话可以使该日期成为特殊格式的差异

答案 1 :(得分:0)

正确的REGEX(在这种情况下)是[0-9 + - ] + [ - |。| /] [0-9] [0-9] [ - |。| /] + [0-9 + - ] +

答案 2 :(得分:0)

您的模式[0-9+-]+[-./][0-9][0-9][-./]+[0-9+-]+会匹配+-+-.99///.///-++++之类的内容,这真的是您想要的吗?

考虑使用

(?:(?P<year>\d{3,4})|(\d{1,2}))(?P<sep>[-./])\d{1,2}(?P=sep)(?(year)\d{1,2}|\d{1,4})

代替。它不允许使用1.2-2014之类的混合分隔符,也不允许多个数字超过2个数字,例如2010-10-2010

Demo.