给出字符串:
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)
答案 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 (_ != ' ')