2013-08-05 463 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(); 
} 
相關問題