2013-08-05 203 views
0

这是我之前问过的一个问题的延续。我需要提取日期模式,它由字符串String1,String2,String3 String4包围。我所做的是Java正则表达式模式,被多个字符串包围

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

这里有一个无效的转义序列:

"...(?<=String1\sString..." 
       ^^ 

你必须转义反斜线在Java String文字把它传递到正则表达式模式:

"...(?<=String1\\sString..." 
       ^^^ 

你已经有了它数字为\\d,但空格为\\s

\\d?=\sString3\sString4) 

有它看起来像你错过了左方括号,使其正向前查找当然\s的,应该是\\s

+0

这是唯一的缺陷?好吧现在就试试。 – newtoprogramming

+1

+1'\ s'不是有效的* java *转义序列。你正在编码一个* java *字符串文字,所以你需要双反斜杠'\\ s'来编码*正则表达式*'\ s' – Bohemian

+0

好吧,我纠正了这一点,但它似乎仍然不起作用。程序运行时会产生错误。有人能告诉我如何提取日期模式以及字符串。字符串是特定的,因此不需要任何模式。 – newtoprogramming

2

你的正则表达式与结束。改变部分:

\\d(?=\\sString3\\sString4) 
+0

是的,我改变了。但是我不理解。我应该将整个正则表达式放在方括号中吗? – newtoprogramming

+0

@ newtoprogramming:你为什么要这样做?您现在应该花时间了解您的模式如何工作。 –

+0

方括号不适用于角色类。如果你清楚地解释你的问题,我们可以尝试帮助你。 – anubhava

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(); 
} 
相关问题