8

我需要询问Java字符串中括号和文本的删除。例如,我有

String str = "I am a new (Software) Engineer"

现在的问题是,如何在不使用的情况下在此处删除子字符串“(软件)”

str.replace("(software)", "")

因为可能在下一个字符串中,我会得到“我是新的(电气)工程师”或“(机械”)或类似的东西。

那么我该怎么做呢,我认为一种方法是获取“(”和“)”的索引并通过使用这些索引来删除/替换它们,但我希望会有一些更短的方法来做到这一点

4

3 回答 3

25

使用正则表达式匹配括号中的任何内容:

str = str.replaceAll("\\(.*?\\) ?", "");

请注意,必须对括号进行转义,并且转义字符\本身必须在字符串中进行转义,因此需要使用反斜杠。

该术语.*?不情愿的匹配,这意味着它不会一直跳到最后一个括号,以防输入中有两个括号中的术语,即“a(foo)b(bar)c”将变为“a c”如果.*被使用,因为它会消耗从第一个左括号到最后一个右括号的所有内容。

我在末尾添加了一个可选空格,因此一旦删除了中间项,就不会留下两个相邻的空格。

于 2013-10-02T11:48:23.993 回答
4

实际上,最有效和最简单的方法是遍历整个字符串并检查括号。它只需要一次扫描。

您还必须跟踪打开和关闭括号的数量,以确保算法对于outside (a text (in another) parenthesis) outside again应该导致outside outside again.

一个或多或少的代码。

public class RemoveParenthesis {
    public static void main(String[] args) {
        int open = 0;
        int closed = 0;
        boolean changed = true;
        int startIndex = 0, openIndex = -1, closeIndex = -1;
        String text = "outside (a text (in another) parenthesis) outside again";
        System.out.println("before: " + text);

        while (changed) {
            changed = false;
            for (int a = startIndex; a < text.length(); a++) {
                if (text.charAt(a) == '(') {
                    open++;
                    if (open == 1) {
                        openIndex = a;
                    }
                } else if (text.charAt(a) == ')') {
                    closed++;
                    if (open == closed) {
                        closeIndex = a;
                        text = text.substring(0, openIndex)
                                + text.substring(closeIndex + 1);
                        changed = true;
                        break;
                    }
                } else {
                    if (open == 0)
                        startIndex++;
                    continue;
                }
            }
        }

        System.out.println("after: " + text);
    }
}
于 2013-10-02T12:13:07.030 回答
0
public static String removeBracketContents(String response) {
        char ch;
        StringBuilder sb = new StringBuilder();
        Stack<Character> stack = new Stack<Character>();
        System.out.println("before removeBracketContents: " + response);
        for (int i = 0; i < response.length(); i++) {
            ch = response.charAt(i);
            switch (ch) {
            case '(':
                stack.push(new Character(ch));
                break;

            case ')':
                if (stack.isEmpty())
                    return response;
                else
                    stack.pop();
                break;
            default:
                if (stack.isEmpty())
                    sb.append(ch);
             break;
            }
        }
        System.out.println("after removeBracketContents: " + sb.toString());
        if (!stack.isEmpty()) {
            System.out.println("Missing ) at end");
            System.out.println("after removeBracketContents: " + response);
            return response;
        } else {
            System.out.println("after removeBracketContents: " + sb.toString());
            return sb.toString();
        }
    }
于 2018-08-28T11:35:49.530 回答