使用java从String中仅删除嵌套的花括号

时间:2014-05-21 15:22:59

标签: java regex parsing

我有这个任务,在消息中有嵌套的大括号。我的动机是只删除最内部的大括号,其余的消息保持不变。字符串消息的示例如下:< / p>

enter code here Input :  {4:{CLIENT ACCOUNT} :-}
                Output:  {4: CLIENT ACCOUNT :-}

所以基本上我们需要确保删除最里面的花括号,其余内容保持不变。如何去做?

我能够使用以下伪代码删除一级括号:

enter code here
String str ="{CLIENT ACCOUNT}";
String regex = "(\\{|\\})"; 
str = str.replaceAll(regex, "");
System.out.println("Formatted String is--"+str);

但我不知道如何使用正则表达式忽略第一级花括号。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我不知道如何使用java正则表达式执行此操作,但您可以执行以下操作:

String str = "someContent";
String newStr = "";
int level = 0;
for (int i = 0; i < str.length(); ++i){
    if (str.charAt(i) == '{'){
        if (level == 0) //check before incrementing
            newStr += "{";
        level++;
    } else if (str.charAt(i) == '}'){
        level--;
        if (level == 0) //check after incrementing
            newStr += "}";
    } else {
        newStr += str.charAt(i);
    }
}

return newStr;

您基本上会逐步浏览字符串中的每个字符,并记住您已经看过多少&#39; {&#39;}&#39;}。然后,如果您的净数为零(或最外面的括号)

,则只打印出来

答案 1 :(得分:0)

不是最漂亮的答案..它不适用于深层嵌套的花括号,但它可以使用多组嵌套的花括号。

(\{[^}]+?|\G[^{]*)\{([^}]+)\}
$1 $2

Demo

{1:{CLIENT ACCOUNT}, 2:{FOO {OOPS} BAR}, 3:{TEST}}
{1: CLIENT ACCOUNT, 2: FOO {OOPS BAR}, 3: TEST}

在上面的演示中,您可以看到当我们有一组多嵌套花括号时导致的错误。这是因为我们假设内容为[^}]+,或者除了结束括号之外的任何内容。这是一个扩展的解释:

(        (?# start capture)
  \{     (?# match { literally)
  [^}]+? (?# lazily match 1+ non-})
 |       (?# OR)
  \G     (?# start back from last match, still in a curly bracket)
  [^{]*  (?# match 0+ non-{ characters)
)        (?# end capture)
\{       (?# match { literally)
(        (?# start capture)
  [^}]+  (?# match 1+ non-} characters)
)        (?# end capture)
\}       (?# match } literally)