Regex Scala正则表达式查找/替换为其他格式

Regex Scala正则表达式查找/替换为其他格式,regex,scala,regex-group,Regex,Scala,Regex Group,我试图替换字符串中包含应该是日期的部分,但可能是不允许的格式。具体而言,所有日期均采用“mm/dd/YYYY”格式,且必须采用“yyy-mm-dd”格式。一个警告是,原始日期可能不完全是mm/dd/YYYY格式;有些像“5/6/2015”。例如,如果 val x = "where date >= '05/06/2017'" 然后 执行所需的更换(返回“2017-05-06”),但 这不会返回所需的替换(返回“2017-5-6”--对我来说,是无效的表示)。使用Joda Time wrap

我试图替换字符串中包含应该是日期的部分,但可能是不允许的格式。具体而言,所有日期均采用“mm/dd/YYYY”格式,且必须采用“yyy-mm-dd”格式。一个警告是,原始日期可能不完全是mm/dd/YYYY格式;有些像“5/6/2015”。例如,如果

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

执行所需的更换(返回“2017-05-06”),但

这不会返回所需的替换(返回“2017-5-6”--对我来说,是无效的表示)。使用Joda Time wrapper
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
等)执行其他处理?如果没有,我如何才能达到预期的结果

重载,可以获取匹配=>字符串。

类似于
$1
的反向引用只能在字符串替换模式中使用。在您的代码中,
“$1”
不再是反向引用

您可以使用带有的“回调”来实际获取匹配对象并访问其组以进一步操作它们:

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)))+"'")
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"))+"'")
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)))+"'")