Java Regex模式,由多个字符串包围

时间:2013-08-05 14:20:23

标签: java regex

这是我之前提出的问题的延续。我需要提取一个日期模式,它由字符串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之间。我很确定有什么问题,因为我的程序上有一个错误,说无效的转义序列,但我无法弄明白。任何帮助表示赞赏。提前谢谢。

3 个答案:

答案 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();
}