3

大家好,感谢到目前为止的帮助。我有一个用于在给定字符串中查找日期的正则表达式,但它似乎不起作用。有人可以告诉我我做错了什么吗?代码类似于

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 中包含一个日期“2013 年 7 月 2 日”,它没有被写入可移除列表。提前感谢任何帮助。

4

3 回答 3

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
于 2013-08-05T10:34:22.073 回答
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$");
于 2013-08-05T10:36:43.957 回答
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/

于 2013-08-05T10:59:45.857 回答