使用正则表达式来匹配字符串中的日期时遇到问题。实际上我有很多“日期格式”要匹配,但第一个不起作用,我不明白为什么它不起作用...
格式类似于“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
我甚至尝试使用较小的正则表达式,但它仍然不匹配。
提前感谢您的帮助!
答案 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));
}