提取字符串和整数

问题描述 投票:0回答:3

我想从中提取艺术家,歌曲和整数:

'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完全不熟悉,所以我真的没有任何线索。

regex scala regex-lookarounds
3个回答
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/


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


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
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.