在方括号中,删除除字符和数字之外的所有内容的正则表达式

6

我使用了

value.replaceAll("[^\\w](?=[^\\[]*\\])", "");

如果符合以下情况,则正常运作

[a+b+c1 &$&$/]+(1+b&+c&)

生成:

[abc1]+(1+b&+c&)

但是对于以下字符串,它仅在第一次运行中删除方括号内部的方括号。
[a+b+c1 &$&$/[]]+(1+b&+c&)

生成:

[a+b+c1 &$&$/]+(1+b&+c&)

1
为什么 a+b+c1 中的 + 没有被移除?根据你的问题,它不应该在那里,对吗?如果表达式是 a+b+c1 ++++--,输出应该是什么? - TheLostMind
抱歉,我写错了。 - Xeshan J
7
只用正则表达式无法解决嵌套括号的问题。请编写一个解析器来处理此类情况。 - anubhava
@XeshanJ 在调用 replaceAll() 之前,似乎应该进行一些预处理。请回答你自己的问题。 - Tim Biegeleisen
1
@anubhava 谢谢,我明白了!我会为此编写一个解析器。 - Xeshan J
@anubhava 写一个完整的解析器可能需要很多时间,尽管我只需要它来完成一小部分工作。有没有什么方法可以使用正则表达式解决嵌套括号的问题? - Xeshan J
1个回答

2

将我的评论翻译成答案

您可以在Java中使用此简单的解析进行替换:

String s = "[a+b+c1 &$&$/[]]+(1+b&+c&)";
int d=0;
StringBuilder sb = new StringBuilder();
for (char ch: s.toCharArray()) {
    if (ch == ']')
        d--;
    if (d==0 || Character.isAlphabetic(ch) || Character.isDigit(ch))
        sb.append(ch);
    if (ch == '[')
        d++;
}
System.out.println(sb);
//=> [abc1]+(1+b&+c&)

唯一的问题是你不能放置未关闭的嵌套括号。 - Xeshan J
是的,对于这种简单方法,括号应该平衡。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接