我想检查是否有任何字符准确发生2次,是否有任何字符准确发生3次。不知何故我无法正常工作。
val pattern1 = "(.)\\1{1}"
val pattern2 = "(.)\\1{2}"
private def checkLine(line: String): (Int, Int) = {
if(line.matches(pattern1) && line.matches(pattern2)) (1, 1)
else if(line.matches(pattern2)) (0, 1)
else if(line.matches(pattern1)) (1, 0)
else (0, 0)
}
它总是返回(0,0)
答案 0 :(得分:1)
这两个正则表达式仅在至少有一个字符恰好出现两次时才匹配,
^(?=.*(.).*\1)(?!(.*\1){3}).*$
Demo for exactly 2 char repeating
这是一个完全重复三次的角色。
^(?=.*(.)(?:.*\1){2})(?!(.*\1){4}).*$
答案 1 :(得分:0)
我为您提供了一个不使用正则表达式的解决方案:
val str: String = "Hello World!"
// Split the String into Strings containing single chars
val arr: Array[String] = str.split("")
// Group the characters into Arrays
val grouped: Array[Array[String]] = arr.groupBy[String](identity[String])
.values
.toArray
// Extract the count of the inner Array
val counted: Array[Int] = grouped.map(_.size)
// Create a tuple containing the information if 2 or 3 values have been found
val tuple: (Boolean, Boolean) = (counted.contains(2), counted.contains(3))
// Transform it into the required representation (true => 1, false => 0)
val tuple2: (Int, Int) = (if(tuple._1) 1 else 1, if(tuple._2) 1 else 0)
println(tuple2)
结果:
(1, 1)
一些信息arr.groupBy[String](identity[String])
的作用:
groupBy
允许在分组之前进行转换。在大多数情况下,这是必需的,但在这种情况下则不需要。在这里,我们希望将相等的字符串分组在一起。因为我们不想转换值,所以我们使用identity[T]
(这是写a => a
的更漂亮的方法)。
我希望这会有所帮助。