我正在尝试替换包含应该是日期的字符串的部分,但这些字符串可能是不允许的格式。具体来说,所有日期都采用“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
等)进行其他处理?如果没有,我怎么能达到预期的效果呢?
答案 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 =>字符串。