如何检查字符是否出现两次

时间:2018-12-04 11:17:44

标签: regex scala

我想检查是否有任何字符准确发生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)

2 个答案:

答案 0 :(得分:1)

这两个正则表达式仅在至少有一个字符恰好出现两次时才匹配,

^(?=.*(.).*\1)(?!(.*\1){3}).*$

Demo for exactly 2 char repeating

这是一个完全重复三次的角色。

^(?=.*(.)(?:.*\1){2})(?!(.*\1){4}).*$

Demo for exactly 3 characters repeating

答案 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)

Try it out!


一些信息arr.groupBy[String](identity[String])的作用:

groupBy允许在分组之前进行转换。在大多数情况下,这是必需的,但在这种情况下则不需要。在这里,我们希望将相等的字符串分组在一起。因为我们不想转换值,所以我们使用identity[T](这是写a => a的更漂亮的方法)。


我希望这会有所帮助。