使用正则表达式或其他优化方式拆分字符串

时间:2017-08-24 17:17:07

标签: regex scala

我有一个非常简单的字符串

YYYYMMDDHHMMSS

基本上是一个完整的日期/时间字符串。举一个例子是

20170224134523

以上暗示

year: 2017
month: 02
day:24
hour:13
min:45
sec:23

我想拆分它,以便我可以在变量(年,月,日,小时,分钟,秒)中使用它。这是我想要的Scala。我在想我应该使用6元组,而在右侧我会使用正则表达式或者最有效的方法。如果我想以简洁的方式做到这一点就是我想要的。正则表达式有点不好。 有人可以帮忙吗?

我可能希望将6元组中的每个变量作为选项类型,否则这也会进行我的理智检查?假设任何变量以None形式出现,我想抛出异常

3 个答案:

答案 0 :(得分:1)

java.text.SimpleDateFormat可以很好地处理这种日期。

scala> val sdf = new SimpleDateFormat("yyyyMMddkkmmss")
sdf: java.text.SimpleDateFormat = java.text.SimpleDateFormat@8e10adc0

scala> val date = sdf.parse("20170224134523")
date: java.util.Date = Fri Feb 24 13:45:23 PST 2017

您可以通过API显示日期的成功解析来获取日期,日期,小时等。

scala> res0.get
getClass   getDate   getDay   getHours   getMinutes   getMonth   getSeconds   getTime   getTimezoneOffset   getYear

此外,我建议将parse调用包装在Try中以处理成功和不成功的解析。

scala> val date = Try(sdf.parse("20170224134523"))
date: scala.util.Try[java.util.Date] = Success(Fri Feb 24 13:45:23 PST 2017)

scala> val date = Try(sdf.parse("asdf"))
date: scala.util.Try[java.util.Date] = Failure(java.text.ParseException: Unparseable date: "asdf")

使用较新的LocalDateTime代替Date及其弃用的方法也是如此。

LocalDateTime.parse("20170224134523", DateTimeFormatter.ofPattern("yMMddkkmmss"))

java.time.LocalDateTime = 2017-02-24T13:45:23

答案 1 :(得分:1)

因为它是一个日期字符串,所以使用专用的日期解析库并解析为日期时间类型可能是有意义的。幸运的是,java提供了一个非常好的java.time包。

val dateTime = LocalDateTime.parse("20170224134523", DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))

将生成LocalDateTime个对象(没有附加时区的日期和时间)。如果您需要更复杂的字符串解析,可以使用DateTimeFormatterBuilder完全根据需要自定义日期格式。

答案 2 :(得分:0)

使用这种可预测的格式,您可以使用子字符串函数(from,to)按位置抓取它到日期类中。

以组的形式获取部分的正则表达式模式是:

(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})

Demo