大家好,感谢您的帮助。我有一个正则表达式,用于在给定字符串中查找日期,但它似乎无法正常工作。有人能告诉我我做错了什么吗?代码类似于
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。提前感谢任何帮助。
答案 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.com,http://regexpal.com/