【问题标题】:How to remove spaces between parentheses in Scala如何在Scala中删除括号之间的空格
【发布时间】:2016-08-27 07:18:44
【问题描述】:

给定字符串:

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)

【问题讨论】:

  • 天哪...既然括号可以嵌套,答案是否定的。不管你怎么努力,都写不出这样的正则表达式。
  • 这个问题是不完整的,没有显示正则表达式需要处理的所有可能的测试用例。
  • ([ 1 + 2 ] + 3) 会删除所有空格吗?嵌套事物时行为会改变吗? 可以嵌套吗?
  • Any 括号中的空格应该被删除,你的例子的结果是([1+2]+3)
  • @Alec 听说过递归正则表达式吗?这很有可能,它只取决于正则表达式引擎。

标签: regex scala


【解决方案1】:

试试这个。

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

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

【讨论】:

    【解决方案2】:

    虽然@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
    

    【讨论】:

      【解决方案3】:

      您的帖子没有提及嵌套括号,因此我假设至少 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)]

      【讨论】:

        【解决方案4】:

        Regex 根本无法做到这一点。它们仅足以决定具有固定数量的嵌套括号的字符串。这是计算理论中的一个重要定理。请参阅 Brian Sipser“计算理论导论”的第 1 部分。

        【讨论】:

          【解决方案5】:

          只需通过以下方式修剪所有空格:

          s filter (_ != ' ')
          

          【讨论】:

          • 删除字符串中的所有空格,我只需要删除括号中的空格,字符串中的其他空格应该保留。
          • 括号不匹配的情况怎么办,例如(3 + 5 7 + 8)
          • 那么你不要删除任何东西,因为它不在括号之间
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-03
          • 2018-03-05
          相关资源
          最近更新 更多