为什么我的正则表达式不适用于约会?

时间:2015-04-13 08:58:32

标签: java regex date

使用正则表达式来匹配字符串中的日期时遇到问题。实际上我有很多“日期格式”要匹配,但第一个不起作用,我不明白为什么它不起作用...

格式类似于“2013年9月12日”或“2014年5月6日”或“2014年6月2日”......

在我的字符串文字中,有以下日期:“2014年7月4日”。

这是我的代码:

Pattern p = Pattern.compile("[a-zA-Z]+ [0-3]?[0-9], (1|2)\\d{3}", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(text);
System.out.println(m.group(1));

但是出现了这个错误:

Exception in thread "main" java.lang.IllegalStateException: No match found

我甚至尝试使用较小的正则表达式,但它仍然不匹配。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您需要在调用Matcher#find()之前调用Matcher#matches()Matcher#group

否则,不执行匹配,因此您既没有整个组,也没有填充任何单个反向引用。

上述两种方法都会返回boolean,这有助于您推断所需的群组是否包含任何文字。

一个典型的习语是:

if (matcher.find()) {
    // get the group(s)
}

文档here

另一方面,我建议您使用DateFormat代替日期的正则表达式 - API here

答案 1 :(得分:0)

您需要检查if(m.find())并打印m.group(0),因为如果您打印m.group(1),则会根据您的输入打印1或2 (1|2),因为您输入的是2014年,m.group(1)将打印2. m.group(0)表示第一组"[a-zA-Z]+ [0-3]?[0-9], (1|2)\\d{3}"并打印您的全文,因为它将您的完整正则表达式作为第一组,因为除了{之外没有其他组{1}}。

试试这段代码。

(1|2)

<强>输出

2014年7月4日

访问here以了解基本的示例

答案 2 :(得分:0)

你需要为m.find()条件并打印m.group(0)代替(1)。

    String text = "July 4, 2014";
    String pattern = "\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\\D [0-9]{1,2}, [0-9]{4}";

    Pattern r = Pattern.compile(pattern);

    Matcher m = r.matcher(text);
    if(m.find()){
    System.out.println("Found value: " + m.group(0));
    }