我正在使用我发现的一些代码来查找字符串中的日期,并略微修改以处理两年和四年的日期。
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”。我该怎么做?
答案 0 :(得分:0)
您的示例输入包含一个月中的单个数字日,您的正则表达式不允许这样做;它将匹配" 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])"
)
或者您可以添加一个负面的lookbehind以确保您不会在较大数字的中间匹配一个月并将其简化为
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.
)
当然,如果您为非美国用户提供服务,假设MONTH / DAY / YEAR订购有问题。
如果您还没有,请参阅"Falsehoods programmers believe about time"。
此外,您的代码将解析15岁或以上出生于1920年的任何人的生日。