2017-04-25 23 views
1

我有一個包含"word1-word2----word3--word4"一個字符串,我要算的分隔符是在這種情況下-,但我想計數的重複實例作爲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) 

其運行時提供了以下錯誤:

java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 1 
|+ 
^ 
at java.util.regex.Pattern.error(Pattern.java:1955) 
at java.util.regex.Pattern.sequence(Pattern.java:2123) 
at java.util.regex.Pattern.expr(Pattern.java:1996) 
at java.util.regex.Pattern.compile(Pattern.java:1696) 
at java.util.regex.Pattern.<init>(Pattern.java:1351) 
at java.util.regex.Pattern.compile(Pattern.java:1028) 
at java.lang.String.replaceAll(String.java:2223) 
at $anonfun$1.apply(<console>:16) 
at $anonfun$1.apply(<console>:15) 
at scala.collection.immutable.List.foreach(List.scala:381) 
    ... 33 elided 

所以我覺得這是有問題replaceAll正則表達式我使用

+0

你可以檢查我的答案更新您的編輯 –

+0

我嘗試了,但它並不能算「 - 」,總爲0 – sam

+0

我不好它做的工作,但我改變最後一行delimiterMap + =一 - >(a +「+」)。r.findAllIn(line).length,thanks Evgeny – sam

回答

3

你可能會分裂你的st環到由正則表達式陣列「 - +」,它找到符號的一個或多個出現次數「 - 」,然後計數陣列的長度減一:

val s = "word1-word2----word3--word4" 
val arr = s.split("-+") // Array(word1, word2, word3, word4) 
arr.length - 1 // 3 

,或者甚至更好,而不需要。減去一個,只是發現這個正則表達式的所有出現:

"-+".r.findAllIn(s).length 

更新由於問題編輯:

|是regex的特殊符號。你應該把它寫成"\\|"。需要雙\才能製作單個\。然後,切換地圖密鑰類型和與String所有分隔符s,而不是Char S以及這種方式:

val delimiterMap = scala.collection.mutable.LinkedHashMap[String, Int]() 
val delimitersList = List(",", ";", ":", "\\|", "\t", "-") 
+0

我一般比較喜歡''「'\\ |」'「''。 –

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

這是相當低效的,但我希望它指出你在正確的方向。

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 
+0

對不起,這是爲了另一個答案。 – sam