我写了一个小应用程序来从String中删除正确的日期。当我有一个字符串,让我们说,“2007-01-12sth”它工作正常,它打印“2007-01-12”。当我有一个字符串“txt2008-01-03”它不行...我认为解释这个的最好方法是粘贴我的整个代码:
public class test
{
public static boolean isValid(String text) {
if (text == null || !text.matches("\\d{4}-[01]\\d-[0-3]\\d"))
return false;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
df.setLenient(false);
try {
df.parse(text);
return true;
} catch (ParseException ex) {
return false;
}
}
public static void main(String[] args) {
// txt2008-01-03 is NOT ok INCORRECT, should print 2008-01-03
// 2007-01-12sth is ok CORRECT
// 20999-11-11 is is NOT ok CORRECT
String date = "txt2008-01-03";
Pattern p = Pattern.compile("\\d{4}-[01]\\d-[0-3]\\d");
Matcher m = p.matcher(date);
if(m.find())
date = date.substring(0, m.end());
if(isValid(date))
System.out.println(date + " ");
}
}
如何从“txt2008-01-03”和“2007-01-12sth”中删除日期? (不仅来自“2007-01-12sth”)
答案 0 :(得分:4)
您的问题是您获取日期的方式:
if(m.find())
date = date.substring(0, m.end());
抓住匹配器找到的东西:
if (m.find())
date = m.group();
但是仍然存在一个问题:使用20999-11-11
你的正则表达式会提取0999-11-11
(也许你的初始代码是为了解释这个问题?)。用这个代替你的正则表达式:
// A date, as long as it is NOT preceded/followed by a digit
Pattern p = Pattern.compile("(?<!\\d)\\d{4}-[01]\\d-[0-3]\\d(?!\\d)");
(?<!...)
是一个负面的背后:“找到以前的内容与...
不匹配的位置。”
(?!...)
是一个负面的预测:“找到一个位置,其中后面的内容与...
不匹配。”
他们有正面版本:(?<=...)
,(?=...)
。