6

私はこのコードを試しました:

string.replaceAll("\\(.*?)","");

しかし、それは null を返します。私は何が欠けていますか?

4

4 に答える 4

18

試す:

string.replaceAll("\\(.*?\\)","");

2 番目の括弧をエスケープせず、最初の括弧に「\」を追加しませんでした。

于 2011-04-12T13:36:22.740 に答える
11

まず、括弧とその内容を削除しますか? 質問のタイトルはいいえを示していますが、括弧も削除したいと思っていると思います。

第 2 に、括弧内の内容に対応するネストされた括弧を含めることができますか? このソリューションは、はいを前提としています。Java 正規表現フレーバーは再帰式をサポートしていないため、解決策は、最初に「最も内側」の括弧のセットに一致する正規表現を作成し、次にこの正規表現を反復的に適用して、それらを裏返しに置き換えることです。(ネストされている可能性がある) 括弧とその内容を正しく削除する、テスト済みの Java プログラムを次に示します。

import java.util.regex.*;
public class TEST {
    public static void main(String[] args) {
        String s = "stuff1 (foo1(bar1)foo2) stuff2 (bar2) stuff3";
        String re = "\\([^()]*\\)";
        Pattern p = Pattern.compile(re);
        Matcher m = p.matcher(s);
        while (m.find()) {
            s = m.replaceAll("");
            m = p.matcher(s);
        }
        System.out.println(s);
    }
}

テスト入力:

"stuff1 (foo1(bar1)foo2) stuff2 (bar2) stuff3"

テスト出力:

"stuff1  stuff2  stuff3"

レイジー ドット スター ソリューションは、入れ子になっているときに最も内側の括弧のセットと一致しないため、決して機能しないことに注意してください。(つまり、上記の例では誤って一致(foo1(bar1)します。) そして、これは非常に一般的に行われる正規表現の間違いです:より正確な表現がある場合は、決してドットを使用しないでください! この場合、一致する括弧の「最も内側」のセットの間の内容は、開き括弧でも閉じ括弧でもない任意の文字で構成されます (つまり、:[^()]*の代わりに: を使用します.*?)。

于 2011-04-12T15:35:53.310 に答える
2

試してみてくださいstring.replaceAll("\\(.*?\\)","")

于 2011-04-12T13:36:03.463 に答える
1

string.replaceAll("\\([^\\)]*\\)",""); このように、ブラケット、次に閉じていないすべてのブラケット文字、そして閉じブラケットに一致すると言っています。これは通常、消極的または貪欲な .* マッチャーよりも高速です。

于 2011-04-12T14:04:34.403 に答える