2017-12-25 18 views
0

次のパターンを簡略化できますか: 次のコードは末尾のゼロを削除していますが、理解できません。Javaのパターンマッチャの例を理解できません

文字列のしきい値が299.0で、出すなぜ我々がやっている299

public static String removeTrailingZeros(String threshold) { 
    Pattern thresholdPattern = Pattern.compile("([\\.,]0)($|\\s+)"); 
    Matcher match = thresholdPattern.matcher(threshold); 
    threshold = match.replaceFirst("$2"); 
    return threshold; 
} 

ある "match.replaceFirstを("$ 2");" 私はその意義を理解できません。

そして、どのようにしてトレーリングゼロを見つけることができますか?

299.00を299に置き換えませんか?私がそれをしたいのであれば、私は299.0と299.00の両方に対応するために何ができますか?

答えて

1

正規表現置換の$ 1、$ 2 ... $ nは、かっこで囲まれた一致への参照です。 $ 0はマッチ全体になり、$ 1は最初の括弧のキャプチャなり、$ 2は、第2なり、等々..

Pattern thresholdPattern = Pattern.compile("([\\.,]0*)($|\\s+)"); 

それは後続ゼロの任意の番号を削除します。

+0

そして、どのように使用されるのですか? – Naresh

+0

299.00を299に置き換えませんか?私がそれをしたいのであれば、私は299.0と299.00の両方に対応するために何ができますか? – Naresh

+0

@Nareshあなたの質問に従って答えを編集しました。 –

0

$2は、この場合は($|\s+)という2番目のキャプチャグループへの参照です。その効果は、存在する場合、末尾の空白を保存することです。それは、単語境界を検出するために、空白を原始的で、幾分混乱させる方法として使用されているようです。

-1

は、グループ化するためoracle docを参照して、このコードを使用します。

inputStr.replaceFirst("^(\\d+)(((!?)[\\.,])([0]*))(\\$|\\s*)$", "$1$6"); 

入力文字列のサンプル:

"299." & "299.00" & "299.000" & ... change to => "299" 

"299.$" & "299.00$" & "299.000$" & ... change to => "299$" 

"299.001" & "299.010" & "299.0001$" & ... not change 

また、あなたがhereでそれを見ることができます。

1

$2は、numbered replacement backreferenceで、第2のcapturing groupでキャプチャした値です。

あなたのパターンが一致した:

  • ([\.,]0)を - と呼ばれるグループ2( - グループ1(置換パターンから$1と呼ぶ).又は,に一致した後、単一0チャー
  • ($|\\s+)文字列の末尾($)または1つ以上の空白文字(\s+)のいずれかに一致する置換パターンの$2

交換に$2を使用する場合は、グループ1の値が破棄され、グループ2の値のみが保持されることを意味します。あなたはlookaround(否定先読み(?!\S))を使用する場合

あなたは、置換パターンで後方参照を使用して回避することができる:

public static String removeTrailingZeros(String threshold) { 
    return threshold.replaceFirst("[.,]0+(?!\\S)", ""); 
} 

あなたはcharactercクラス内.をエスケープする必要はありません。ここで、[.,]0+(?!\S)パターンが一致した:

  • [.,]からcharacter classマッチングのいずれか.又は,
  • 0+から1以上の連続発生
  • (?!\S)0の - マッチに失敗した負の先読みがある場合現在の場所のすぐ右にある空白(\S)以外の文字。簡単にするために
0

は、それがtraillingのzeroresを見つけることができ、このコード

String example = "299.00"; 
example = example.replaceAll("\\\\.0+", ""); 
関連する問題