这是我之前提出的问题的延续。我需要提取一个日期模式,它由字符串String1,String2,String3 String4包围。我做的是
Pattern pattern = Pattern.compile("(?<=String1\sString2\s(?:0?[1-9]|[12][0-9]|3[01])([- /.])(?:0?[1-9]|1[012])\\1(?:19|20)?\\d\\d?=\sString3\sString4)");
我的约会模式是
(0?[1-9]|[12][0-9]|3[01])([- /.])(0?[1-9]|1[012])\\2(19|20)\\d\\d
工作正常,但在尝试用字符串包围时,我遇到了麻烦。
日期介于String2和String3之间。我很确定有什么问题,因为我的程序上有一个错误,说无效的转义序列,但我无法弄明白。任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:3)
这里有一个无效的转义序列:
"...(?<=String1\sString..."
^^
你必须在java String中转义反斜杠文字以将其传递给正则表达式模式:
"...(?<=String1\\sString..."
^^^
对于数字,您已经使用\\d
使用了正确的数字,但是对于空格而言,\\s
没有。
答案 1 :(得分:2)
你的正则表达式以:
结尾\\d?=\sString3\sString4)
看起来你错过了一个开放的方括号,使它正向前瞻,当然\s
应该是\\s
。将该部分更改为:
\\d(?=\\sString3\\sString4)
答案 2 :(得分:1)
我知道很多人都不知道精彩班级MessageFormat
的功能,所以这里有一个快速提醒:
MessageFormat format = new MessageFormat("String1 String2 {0,date} String3 String4");
try {
Object[] parse = format.parse("String1 String2 31.8.2000 String3 String4");
Date date = (Date) parse[0];
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}