2017-06-24 15 views
1

テキストフィールドにカンマで区切った数字のシーケンスを入力する必要があります。カンマと数字以外のすべての文字を入力することは禁じられています。しかし、ラインに2つのカンマを入力することは可能です。 \ d + \、のような正規表現この場合は動作しません。テキストフィールドの2つのコンマを連続して禁止するjavafx

私は間違っていますか?

public class TextFieldCustom extends TextField { 

    public TextFieldCustom(){ 
    } 

    @Override 
    public void replaceText(int start, int end, String string) { 
    if (string.matches("[0-9,]")|| string.isEmpty()){ 
     super.replaceText(start, end, string); 
    } 
    } 

    @Override 
    public void replaceSelection(String string){ 
    super.replaceSelection(string); 
    } 
} 

答えて

1

negative lookaheadを使用できます。以下は例です。 replaceの代わりに、ChangeListenerを使用する方が簡単です。

TextField tf = new TextField(); 
    tf.textProperty().addListener(new ChangeListener<String>() { 

     @Override 
     public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
      if (!newValue.matches("(?!.*,,)[\\d,]*")) { 
       ((StringProperty)observable).setValue(oldValue); 
      } 
     } 
    }); 

説明

(?!  # it means that everything after should not be matched 
.*,, # any symbols followed by double comma 
)  # close lookahead 
[\\d,]* # matched digits and commas in any amounts 
+0

ありがとうございました!それだけが必要!実数で交互に現れるカンマとドットを避けるため、「(?!。* ,, |。* \\。\\。|。* \\。、|。*、\\。)[\\ d、 。] * ")それは私のために働く! –

+0

@Роман少し過度なバージョンを試してください: ''(?!。* [\\。、] {2、})[\\ d、\\。] * "' –

+0

@ Sergey!あなたの助けが私を強くする!もう1つの間違いを見つけました。あなたが提案した解決策を使用する場合は、次のように入力してください:2,2.1.2 つまり、ポイントと数字を入力した後、もう一度ポイントを入力することができます数字またはカンマのみにしてください。私はこれを解決する方法を理解していません。 –

0

のみ1桁以上の数字を含む文字列にマッチする文字列に一致する正規表現は、, +数字(複数可)の配列の任意の数の後、あなたかもしれません使用

s.matches("[0-9]+(?:,[0-9]+)*") 

regex demoを参照してください。

String#matches()方法は、デフォルトでは、文字列を固定するので、あなたは\A(または^、文字列の先頭)と\z(=文字列の一番最後)アンカーを必要としません。

  • [0-9]+から1桁以上
  • (?:,[0-9]+)* - ゼロ以上(*)の配列:
    • , - コンマ
    • [0-9]+ - 1+桁。
関連する問題