我有这个任务,在消息中有嵌套的大括号。我的动机是只删除最内部的大括号,其余的消息保持不变。字符串消息的示例如下:< / 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);
但我不知道如何使用正则表达式忽略第一级花括号。非常感谢任何帮助。
答案 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
{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)