【问题标题】:Regex scala: Format matching and paddingRegex scala:格式匹配和填充
【发布时间】:2018-03-19 19:53:03
【问题描述】:

正确的输入格式:xxxx/yyyy/zzzz,即每个部分 4 个字符。 字符串的总长度(不包括“/”)应始终为 12。

输入可以是:xxx/yyy/zzz 然后它应该被填充为 0xxx/0yyy/0zzz

在这个阶段至少会有一个“/”。如果有 2 个部分,那么我们都需要 6 个字符。

在 Scala 中寻找具有填充逻辑的正则表达式。

// line to tune: 
val matchThis = raw"(\d{4})/(\d{4})/(\d{4})".r

val valids = List ("1/6", "123456/1", "1/123456", "123456/123456", "1/2/3", "1234/1234/1234", "012/12/3", "1/01/012")
val invalids = List ("/6", "1234567/1", "1/1234567", "1234567/1234567", "/2/3", "1/2/", "12345/1234/1234", "012/12345/3", "1/01/012345")

def tester (input: String) = {
  input match {
      case matchThis(_*) => "It's valid!"
      case _ => "Need some work" /*???*/
  }
}

valids.map (s => tester(s))
invalids.map (s => tester(s))

【问题讨论】:

  • 如果它已经包含前导零? “0001/0100/0123/”怎么样?但是“01/100/123”无效?如果我们有 2 个子字符串,应该添加多少个前导零?
  • "0001/0100/0123/" 很好,我们不需要做任何其他事情。而对于“01/100/123”,它需要填充到“0001/0100/0123/”。添加零件时,最终计数应为 12。至少会有 2 个部分,最好是 3 个,不会更多。
  • 但是“//”不能填成“0000/0000/0000”或“/”不能填成“000000/000000”?
  • 我们会忽略这种情况,它们不会为下游提供任何价值。
  • 您应该提供两个列表,一个包含所有匹配项,一个包含所有失败的表达式和一个方法,以进行映射。

标签: regex scala


【解决方案1】:

这不是万无一失的,但我认为它涵盖了您所描述的大部分内容。

val valid = raw"(\d{1,6})/(\d{1,6})(?:/(\d{1,4}))?".r
val output = input match {
  case valid(a,b,null) => f"$a%6s/$b%6s"       replaceAll(" ","0")
  case valid(a,b,c)    => f"$a%4s/$b%4s/$c%4s" replaceAll(" ","0")
  case _ => "invalid"
}

更完整一点。

val valid = raw"(\d{1,4})/(\d{1,4})/(\d{1,4})|(\d{1,6})/(\d{1,6})".r
val output = input match {
  case valid(null,null,null,a,b) => f"$a%6s/$b%6s"       replaceAll(" ","0")
  case valid(a,b,c,null,null)    => f"$a%4s/$b%4s/$c%4s" replaceAll(" ","0")
  case _ => "invalid"
}

【讨论】:

  • 为输入 12345/1234/1234, 012/12345/3 返回 2345/1234/1234, 0012/2345/0003 但应该返回无效,无效。
猜你喜欢
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2021-12-17
相关资源
最近更新 更多