我正在使用一些代码来查找字符串中的日期,只要稍加修改,就可以处理两年和四年的日期。
Matcher m = Pattern.compile("(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](2[0][0-9][0-9]|[0-9][0-9])").matcher(msgBody.substring(iStart));
while (m.find()) {
allMatches[count] = m.group();
count++;
}它返回我正在搜索的字符串中的大多数两位数和四位数的年份日期,但当字符串包含"*Valid 11/3/14-11/9/14“时不返回结果。
我期待返回"11/3/14“的第一次发现和"11/9/14”的第二次发现。我该怎么做?
发布于 2014-11-09 18:46:32
您的示例输入包含月中的个位数日,这是regexp不允许的;它将匹配"11/03/14“,但不匹配"11/3/14”。
如果你想匹配个位数的话,我认为你的0[1-9]应该是0?[1-9]。
Pattern.compile(
"(0?[1-9]|1[012])"
+ "[- /.]"
+ "(0?[1-9]|[12][0-9]|3[01])"
+ "[- /.]"
+ "(2[0][0-9][0-9]|[0-9][0-9])"
)或者,您可以添加一个负值,以确保在一个较大的数字中不匹配一个月,并将其简化为
Pattern.compile(
"(?<![0-9])" // Don't start match in middle of a number.
+ "(0?[1-9]|1[012])" // Month of year
+ "[- /.]" // Separator
+ "(0?[1-9]|[12][0-9]|3[01])" // Day of month
+ "[- /.]" // Separator
+ "(20[0-9][0-9]|[0-9][0-9])" // 2 or 4 digit year
+ "(?![0-9])" // Don't match if year continues.
)当然,假设月/日/年的订购是有问题的,如果你是为非美国用户服务。
如果您还没有,请参见“程序员相信时间的谬误”。
此外,您的代码将解析任何15岁或15岁以上的人的生日,因为他们出生于1920年。
https://stackoverflow.com/questions/26831789
复制相似问题