什么是基于字符数创建组的正则表达式?

时间:2013-06-18 11:02:58

标签: regex sanitization

我想运行表达式的字符串将是以下两种类型:

  

2012-11即yyyy-mm

     

11-2012 ie mm-yyyy

我想编写一个正则表达式来构造格式字符串:

  

(正则表达式group1) - (正则表达式group2)

使得group1始终是yyyy部分,group2是mm。

我想编写此函数以将日期格式规范化为单个yyyy-mm类型。

可以使用正则表达式来解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

如果你可以使用前瞻,你可以使用这样的东西:

(?=.*(\b\d{4}\b))(?=.*(\b\d{2}\b)).*

并替换为:

\1-\2

(或$1-$2

请参阅here

答案 1 :(得分:1)

匹配:\b(?:(\d{4})-(\d{2})|(\d{2})-(\d{4}))\b

替换:$1$4-$2$3

如果某个组未参与该匹配,则替换字符串中对该组的任何引用都将被视为空字符串。因此,与#4组连接的组#1将始终是年份,组#3与组#3连接将始终是该月。

这假设您正在使用您的语言的正则表达式替换机制,如PHP的preg_replace()或Java的replaceAll()。如果您使用(例如)Java的group(n)方法,则非参与组将返回为空值,当您将它们分配给字符串变量时,将转换为单词null。所以像

这样的作业
String year = m.group(1) + m.group(4);

...会产生2011nullnull2011。大多数语言比这更聪明,但这是你应该注意的。