我有一个包含"word1-word2----word3--word4"
的字符串,我想计算在这种情况下-
的分隔符,但我想将重复实例计为1
({{1 }}将是---
),我使用1
计算line.count(_ == '-')
,我需要它7
。
由于
编辑: 我有一系列分隔符如下
3
运行时出现以下错误:
val delimiterMap = scala.collection.mutable.LinkedHashMap[Char, Int]()
val delimitersList = List(',', ';', ':', '|', '\t','-')
for (a <- delimitersList)
delimiterMap += a -> line.replaceAll(a.toString+"+",a.toString).count(_ == a)
所以我认为我使用的replaceAll正则表达式存在问题
答案 0 :(得分:3)
你可以通过regex&#34; - +&#34;将你的字符串分成数组,它会找到一个或多个符号&#39; - &#39;,然后计算数组的长度减一:
val s = "word1-word2----word3--word4"
val arr = s.split("-+") // Array(word1, word2, word3, word4)
arr.length - 1 // 3
或者,甚至更好,无需减去一个,只需找到所有出现的这个正则表达式:
"-+".r.findAllIn(s).length
由于问题修改而更新:
|
是正则表达式的特殊符号。你应该把它写成"\\|"
。单\
需要加倍\
。然后,以这种方式更改地图密钥类型和所有分隔符String
s而不是Char
s:
val delimiterMap = scala.collection.mutable.LinkedHashMap[String, Int]()
val delimitersList = List(",", ";", ":", "\\|", "\t", "-")
答案 1 :(得分:0)
我不确定我是否完全理解这个问题,但你基本上是在考虑分隔符而不是单词?
离开我的头顶你可以做这样的事情
val s = "word1-word2----word3--word4"
val nonConsecutiveOccurrences = s.split("[^-]") //filter characters that aren't '-'
.filterNot(_.isEmpty)//get rid of empty strings
.map(_.count(_ =='-'))// Array[Int] = Array(1, 4, 2)
执行nonConsecutiveOccurrences.length
应生成3
。
这是非常低效的,但我希望它指出你正确的方向。
答案 2 :(得分:0)
您可以使用正确的正则表达式。
scala> val s = "word1-word2----word3--word4"
// s: String = word1-word2----word3--word4
// now lets use a regex which will match one-or-more "-"
scala> val regex = "-+".r
// regex: scala.util.matching.Regex = -+
scala> val count = regex.findAllIn(s).length
// count: Int = 3