提取字符串和整数

时间:2017-12-16 20:52:13

标签: regex scala regex-lookarounds

我想从:

中提取艺术家,歌曲和整数
'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0

我一直在使用这个正则表达式:

"""(?<=')(.+?)(?=')|(\d)""".r

如何将其转换为元组?输出看起来像

(WATTS 103RD STREET RHYTHM BAND, DO YOUR THING, 0)

如何添加一个map函数来执行这个元组转换到每个这样的行

'Artist', 'Song', int(0 or 1) [Line format]

在文件中?

我对Scala完全陌生,所以我没有任何线索。

3 个答案:

答案 0 :(得分:0)

如果您的模式总是'artist', 'song', plays,那么听起来有效的模式是(')(artist)(',)(song)(',)(plays)。所以正则表达式看起来像

scala> val extractionPattern = """(')(.*)(',\s+')(.*)(',\s+)(\d+)""".r
extractionPattern: scala.util.matching.Regex = (')(.*)(',\s+')(.*)(',\s+)(\d+)

根据您的输入,它将为您提供6个匹配,您只关心第2,第4和第6个。

scala> extractionPattern.findAllIn("""'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 100""")
                        .matchData.map(_.subgroups).toList
res70: List[List[String]] = List(List(', WATTS 103RD STREET RHYTHM BAND, ', ', DO YOUR THING, "', ", 100))

所以只需处理你关心的人,

scala> extractionPattern.findAllIn("""'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 100""")
                        .matchData.map(_.subgroups)
                        .flatMap(matches => Seq(matches(1), matches(3), matches(5))).toList
res71: List[String] = List(WATTS 103RD STREET RHYTHM BAND, DO YOUR THING, 100)

也可以在线查看正则表达式工作 - https://regex101.com/r/vcBJcI/1/

答案 1 :(得分:0)

好像你正在处理CSV文件?如果是这种情况,我会考虑使用:https://github.com/tototoshi/scala-csv或一些现有的库。

如果您只是想玩得开心,我会加入并且不会检查除您提供的其他情况之外的以下正则表达式代码似乎有效(?:是非捕获组)

val input = """'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0"""
val regex = """(?:')(.+?)(?:')|\d""".r

regex.findAllIn(input).matchData.toList

产生:

List('WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0)

https://scalafiddle.io/sf/2fEtCsv/0

答案 2 :(得分:0)

目前尚不清楚为什么需要将输入数据转换为元组并返回到明显相同的输出格式(请参阅我的评论)。 无论如何这里是你可能想要的:

  def matchData(s: String) = {
    val pattern = """('[\w\s]+'),\s*('[\w\s]+'),\s*(\d)""".r

    s match {
      case pattern(artist, song, n) => Some(artist, song, n)
      case _ => None
    }
  }

  List("""'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0""") map matchData map { mayBeTuple =>
    mayBeTuple match {
      case Some((artist, song, n)) => println(artist, song, n)
      case _ => // ignore
    }
  }