2011-10-26 9 views
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は私が間違ってやっているのと、コンソールに

任意のアイデアを印刷したものです:

は、私はまた、パターンマッチを使用しようとしましたか?私はこれを数時間見てきました。ありがとう!

答えて

2

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

括弧で囲まれた文字列の部分と一致するように、\(.*?\)または\([^)]*\)を使用してください。

周囲の空白を随意に食べたい場合は、\s*を正規表現のいずれかの側に置くか、結果をトリミングします。

+0

ありがとうalex、これは今では完全に動作します(ただし、左右の括弧の前に\\エスケープシーケンスを使用しなければなりませんでした:\\(。*?\\)。 –

0

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

ただし、replaceAll()またはreplaceFirst()を使用した場合、同じ結果になります。正規表現内の^はゼロ幅アサーションです。 はすべての文字を消費しません。文字列の先頭に一致するものだけをアンカーします。私はあなたの第二の例から見ることが期待される結果は、言い換えれば、文字列全体(group(0))と2つの空の文字列(group(1)group(2))で

> 56.0F (13.3C) 
> 
> 

です。これは、両方の括弧がキャプチャグループとして解釈されるためです。あなたは(リテラル)括弧とその内容を一致させたい場合は、使用することができます。

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

...またはより良いを:

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

すべてでキャプチャグループを使用する必要はありません。

関連する問題