0

区切り文字間の文字列を取得して削除する方法の例をいくつか見てきました。ただし、非常に単純なテスト ケースを作成しましたが、さまざまな例に基づいて間違った出力が得られます。検索している文字列ではなく、検索ソースとして使用したい文字列が返されるのはなぜですか?

String temp = "56.0 F (13.3C)";
String exp = "((^))";
String p = temp.replace(exp, "");
System.out.println("p=" + p); 

出力として文字列を取得し56.0F (13.3C)ます。

私は56.0F戻ってくることを期待しています。

パターンマッチャーも使用しようとしました:

Pattern pattern = Pattern.compile(exp);
Matcher matcher = pattern.matcher(temp);
if (matcher.find()) {
    System.out.println(matcher.groupCount());
    for (int i=0; i<=matcher.groupCount(); i++) {
        String groupStr = matcher.group(i);
        System.out.println(groupStr);
    }
}

2 はコンソールに出力されるものです

私が間違っていることについてのアイデアはありますか?私は今これを数時間見ています。ありがとう!

4

2 に答える 2

2

置換ができなかったため、文字列を返しています。

\(.*?\)orを使用し\([^)]*\)て、括弧で囲まれた文字列の部分を一致させてみてください。

オプションで周囲の空白を使い果たしたい場合\s*は、正規表現のどちらかの側に置くか、結果をトリムします。

于 2011-10-26T02:04:54.770 に答える
0

replace()メソッドが正規表現の置換を実行しないため、最初の例では元の文字列が出力されます。((^))もちろん存在しないリテラル string を置き換えようとしています。

replaceAll()ただし、またはを使用した場合は、同じ結果が得られますreplaceFirst()。正規表現の^は幅ゼロのアサーションです。文字を消費せず、一致を文字列の先頭に固定するだけです。あなたの2番目の例から私が期待する結果は

> 56.0F (13.3C)
>
>

つまり、文字列全体 ( group(0)) と 2 つの空の文字列 (group(1)およびgroup(2)) です。これは、両方の括弧のセットがキャプチャ グループとして解釈されるためです。(リテラル)括弧とその内容を一致させたい場合は、次を使用できます。

String exp = "\\(.*?\\)";

...またはさらに良い:

String exp = "\\([^()]*\\)";

キャプチャ グループを使用する必要はまったくありません。

于 2011-10-26T02:59:29.430 に答える