8

Java String の括弧とその中のテキストの削除について質問する必要があります。たとえば、私は

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

問題は、使用せずにここで部分文字列「(ソフトウェア)」を削除する方法です

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

次の文字列にある可能性があるため、「私は新しい(電気)エンジニアです」または「(機械」)またはそのようなものになります。

どうすればこれを行うことができますか?1つの方法は、「(」と「)」のインデックスを取得し、そのインデックスを使用してそれらを削除/置換することだと思いますが、これを行うためのより短い方法があることを願っています

4

3 に答える 3

25

正規表現を使用して、角かっこ内のすべてに一致させます。

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

括弧はエスケープする必要があり、エスケープ文字\自体は文字列でエスケープする必要があるため、バックスラッシュが2 つあることに注意してください。

この用語.*?消極的な一致です。つまり、入力に括弧で囲まれた用語が 2 つある場合、最後の括弧まではスキップしません。つまり、「a (foo) b (bar) c」は「a c」になります。.*最初の開き括弧から最後の閉じ括弧まですべてを消費するため、使用されました。

最後にオプションのスペースを追加したので、介在する用語を削除すると、隣接する 2 つのスペースが残りません。

于 2013-10-02T11:48:23.993 に答える
4

実際、最も効率的で確実な方法は、文字列全体を調べて括弧をチェックすることです。必要な掃引は 1 回だけです。

のような文に対してアルゴリズムが正しいことを確認するために、開いた括弧と閉じた括弧の量を追跡する必要もあり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 に答える