如何删除Scala中括号之间的空格

时间:2016-08-26 20:46:43

标签: regex scala

给出字符串:

val s = "[ a + 5 + (   1   +  2)]"

我需要将其转换为:

[ a + 5 + (1+2)]

我应该如何实现这一目标?正则表达式?

应从括号内删除空格:字符串中的任何其他空格应保持原样。

另一个例子:

aaa   bbb   ccc   (   1   +   2   )

应该返回:

aaa   bbb   ccc   (1+2)

另一个例子:

(  1  +  2  )  +  (  3  +  4  )

应该返回:

(1+2)  +  (3+4)

5 个答案:

答案 0 :(得分:5)

试试这个。

def squeezeParens(str: String): String =
  str.foldLeft(("",0)){ case ((result, depth),c) => c match {
    case '('              => (result + c, depth+1)
    case ')' if depth > 0 => (result + c, depth-1)
    case ' ' if depth > 0 => (result,     depth)
    case  _               => (result + c, depth)
  }}._1

它应删除所有空格字符后的第一个'('直到找到匹配的')'。它会删除空格,即使匹配的''找不到。

答案 1 :(得分:3)

虽然@jwvh的答案解决了这个问题,但我的做法略有不同:

def squeeze(inputString: String, depth: Integer = 0): String = {
  if (inputString.isEmpty) ""
  else
    inputString.head match {
      case '(' => '(' + squeeze(inputString.tail, depth + 1)
      case ')' if depth > 0 => ')' + squeeze(inputString.tail, depth - 1)
      case ' ' if depth > 0 => squeeze(inputString.tail, depth)
      case c : Char => c + squeeze(inputString.tail, depth)
    }
}

这会导致设计稍微简洁,您可以使用默认参数,因此您不必将元组传递给该行。你也可以很容易地概括一下:

def squeeze(inputString: String, depth: Integer = 0)
           (remove: Char, replace: String)
           (open: Char, close: Char)
           : String = {
  if (inputString.isEmpty) { "" }
  else {
    inputString.head match {
      case `open` => open + squeeze(inputString.tail, depth + 1)(remove, replace)(open, close)
      case `close` if depth > 0 =>
        close + squeeze(inputString.tail, depth - 1)(remove, replace)(open, close)
      case `remove` if depth > 0 =>
        replace + squeeze(inputString.tail, depth)(remove, replace)(open, close)
      case c : Char => c + squeeze(inputString.tail, depth)(remove, replace)(open, close)
    }
  }
}

val squeezeParen: (String) => (String) = squeeze(_)(' ', "")('(', ')')
val underscoreBracket: (String) => (String) = squeeze(_)(' ', "_")('[', ']')

正确性:

val a = "aaa   bbb   ccc   (   1   +   2   )"
val a_correct = "aaa   bbb   ccc   (1+2)"

val b = "(  1  +  2  )  +  (  3  +  4  )"
val b_correct = "(1+2)  +  (3+4)"

val c = "[ a + 5 + (   1   +  2)]"
val c_correct = "[ a + 5 + (1+2)]"
val c_alt = "[_a_+_5_+_(___1___+__2)]"

squeezeParen(a) == a_correct  // true
squeezeParen(b) == b_correct  // true
squeezeParen(c) == c_correct  // true
underscoreBracket(c) == c_alt  // true

答案 2 :(得分:1)

你的帖子没有说明有关嵌套括号的任何内容,所以我假设应该删除至少1级括号内的任何空格。

这个答案并没有使用正则表达式,但确实有效。

def removeSpacesInParens(str: String): String = {
    var parenCount = 0

    str.toList.map{
        case '(' => parenCount+=1; "("
        case ')' => parenCount-=1; ")"
        case c: Char => 
            if(c!=' '){
                c
            }else{
                if(parenCount>=1){""}else{" "}
            }
    }.mkString
}

应用于[ a + 5 + ( 1 + 2)]

结果是:[ a + 5 + (1+2)]

答案 3 :(得分:0)

正则表达式根本无法做到这一点。它们的功能足以决定具有固定数量嵌套括号的字符串。这是计算理论中的一个重要定理。参见Brian Sipser的第1部分"计算理论导论"。

答案 4 :(得分:-1)

通过以下方式修剪所有空白区域:

s filter (_ != ' ')