2017-07-25 124 views
2

代替我試圖替換包含應該是什麼日期字符串的一部分,但它可能是在不允許的格式。具體而言,所有日期的格式爲「mm/dd/YYYY」,並且需要採用「YYYY-mm-dd」格式。一個需要注意的是,原始日期可能不是,其確切地說是以mm/dd/YYYY格式;有些像「5/6/2015」。例如,如果斯卡拉正則表達式查找/有額外的格式

val x = "where date >= '05/06/2017'" 

然後

x.replaceAll("'([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})'", "'$3-$1-$2'") 

執行所需的更換(返回 「2017年5月6日」),但對於

val y = "where date >= '5/6/2017'" 

這並不返回所需的替換(返回「2017-5-6」 - 對我來說,表示無效)。隨着約達時間包裝nscala-time,我試圖捕捉的日期,然後重新格式化它們:

import com.github.nscala_time.time.Imports._ 
import org.joda.time.DateTime 

val f = DateTimeFormat.forPattern("yyyy-MM-dd") 
y.replaceAll("'([0-9]{1,2}/[0-9]{1,2}/[0-9]{4})'", 
    "'"+f.print(DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime("$1"))+"'") 

但是失敗了java.lang.IllegalArgumentException: Invalid format: "$1"。我也嘗試使用f插補器和填充0,但它似乎並不喜歡這一點。

您是否無法對replaceAll內的捕獲組($1等)執行其他處理?如果不是,我還能如何實現預期的結果?

回答

2

$1像反向引用只能內部串替換模式來使用。在您的代碼中,"$1"不再是反向引用。

你可以使用一個「回調」與replaceAllIn實際拿到賽對象並訪問其組進一步操縱他們:

val pattern = "'([0-9]{1,2}/[0-9]{1,2}/[0-9]{4})'".r 
y = pattern replaceAllIn (y, m => "'"+f.print(DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(m.group(1)))+"'")