我正在使用一些代码来查找字符串中的日期,并稍加修改即可处理两年和四年的日期。
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”。我该怎么做?
最佳答案
您的示例输入包含月份中的个位数天数,这是您的正则表达式所不允许的;它将匹配“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.
)
当然,如果您为非美国用户提供服务,假设月/日/年排序是有问题的。
如果您还没有这样做,请参阅 "Falsehoods programmers believe about time" .
此外,您的代码会将 15 岁或以上的任何人的生日解析为出生于 1920 年。
关于java - 在字符串中查找日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26831789/