Scala正则表达式使用其他格式查找/替换

时间:2017-07-25 18:33:41

标签: regex scala regex-group

我正在尝试替换包含应该是日期的字符串的部分,但这些字符串可能是不允许的格式。具体来说,所有日期都采用“mm / dd / YYYY”形式,并且需要采用“YYYY-mm-dd”形式。需要注意的是,原始日期可能完全采用mm / dd / YYYY格式;有些像“2015年5月6日”。例如,如果

    from tweepy.auth import OAuthHandler
    consumer_token = 'XXX'
    consumer_secret = 'YYY'
    auth = tweepy.OAuthHandler(consumer_token, consumer_secret)

然后

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

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

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

这不会返回所需的替换(返回“2017-5-6” - 对我来说,表示无效)。使用Joda Time包装器val y = "where date >= '5/6/2017'" ,我尝试捕获日期,然后重新格式化它们:

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"插值器和填充0,但它似乎也不喜欢。

您是否无法对f内捕获的群组($1等)进行其他处理?如果没有,我怎么能达到预期的效果呢?

2 个答案:

答案 0 :(得分: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)))+"'")

答案 1 :(得分:1)

Regex.replaceAllIn已超载,可以参加Match =>字符串。