用于在字符串中查找日期的正则表达式

时间:2013-08-05 10:26:26

标签: java regex

大家好,感谢您的帮助。我有一个正则表达式,用于在给定字符串中查找日期,但它似乎无法正常工作。有人能告诉我我做错了什么吗?代码类似于

Pattern pattern = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d(?:,)$");
Matcher match = pattern.matcher(text1);

List<String> removable1 = new ArrayList<String>();             
while(match.find()) {
    removable1.add(match.group());
}

我知道字符串text1中包含一个日期“7/2/2013”​​,该日期未写入可删除列表1。提前感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您的模式不允许使用一位数的日期和月份。将前导0设为可选:

^(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\\d\\d(?:,)$

另外,我不确定尾随的逗号是做什么的。另外,你说“包含在字符串中”,但是^$将模式锚定到开头和结尾。因此,如果您想要查找日期,您可能想要删除这些:

(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\\d\\d

最后,如果你想确保两个日期分隔符都是相同的字符,你可以这样做:

(0?[1-9]|[12][0-9]|3[01])([- /.])(0?[1-9]|1[012])\\2(19|20)\\d\\d

最后,对于某些优化,避免捕获不需要的地方(并且可能使世纪成为可选的:

(?:0?[1-9]|[12][0-9]|3[01])([- /.])(?:0?[1-9]|1[012])\\1(?:19|20)?\\d\\d

答案 1 :(得分:1)

试试这个

String text1="07/02/2013";
Pattern pattern = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d$");

答案 2 :(得分:1)

你使用的正则表达式是不正确的。例如,匹配日期的任务部分

0[1-9]|[12][0-9]|3[01])

如果day为1~9,则此正则表达式表示0应该用作前缀。

要解决此问题,您应该添加?这意味着前一项是可选的。因此,您可以将正则表达式字符串更改为

(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d

将来,您可以使用正则表达式测试程序来调试这些问题。它们很有用,有助于节省时间。例如, http://regex.uttool.comhttp://regexpal.com/