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