0

我正在尝试编写一个可以从长字符串中解析出日期的Java例程,即给定字符串:

"Please have the report to me by 6/15, because the shipment comes in on 6/18" 

正则表达式会找到 6/15 和 6/18。我查看了 Stack Overflow 和其他地方,大多数日期正则表达式示例只是验证给定字符串是否为日期,而不是在大量文本中查找日期。理想情况下,我想要一个正则表达式,它可以识别人们以数字方式书写日期的所有主要方式,即6/15, 6/15/12, 06/15/12, 15/6/12, 15/06/12,尽管出于 cla 的目的,最好将它们分成不同的正则表达式。我是正则表达式的新手(我两天前才开始了解它们)并且正则表达式对我来说仍然有点神秘,所以我很感激任何正则表达式建议的详细解释。

4

3 回答 3

2

如果您不关心范围检查,这就足够了:

(\d{1,2})/(\d{1,2})(?:/(\d{4}|\d{2}))?

要检查你不能做2/29/2001但可以做2/29/2000,你真的想在正则表达式完成它的工作之后再做,或者你最终会陷入庇护。

编辑:更好的是,为了隔离世纪,并防止像 2/193 这样的事情(由亚历克斯的问题提示,即使这是一个单独的问题):

\b(\d{1,2})/(\d{1,2})(?:/(\d{2})?(\d{2}))?\b

你会在每场比赛中获得 4 次捕获:[month, day, century, year]、 wherecenturyyear可能为空。

于 2012-06-18T18:11:49.557 回答
0
\d{1,2}/\d{1,2}(?:/(?:\d{2}){1,2})?

这是细分:

  • \d{1,2}匹配 1 位或 1 位数字
  • / 其次是/
  • \d{1,2}后跟 1 或 2 个数字
  • (?:/(?:\d{2}){1,2})?后跟一个可选的斜线和 2 或 4 位数的年份

从匹配项中,您可能希望使用 Java DateParse 解析它们,而不是尝试将所有验证规则放入正则表达式中。

您可能还想防止分数1/4th 这可以通过在您的正则表达式中附加一个否定的前瞻来完成:(?!th|rd|nd)这会导致正则表达式在后跟 , 或 时thrd匹配nd

于 2012-06-18T18:14:09.090 回答
0

What exactly is your question? You should read some guide about regex first.

You need a method that returns every match in the String like this: p is the regex, text is your text.

private LinkedList<String> matches(String p, String text) {
    LinkedList<String> results = new LinkedList<String>();

    Pattern pattern = Pattern.compile(p);
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        results.add(matcher.group());
    }

    return results;
}

You can separate each date-pattern with |

If you put a part of your regex into braces (...), this part is treated as a "group". So you can extract single numbers out of the matching string (if you want to).

于 2012-06-18T18:26:17.587 回答