2016-10-04 5 views
1

を働いていないダッシュを強制的に:123456-12-1234正規表現は、私は次のように番号をフォーマットしようとしてる

$('.telnumber').keyup(function() { 
    var foo = $(this).val().split("-").join(""); // remove hyphens 
    foo = foo.match(new RegExp('.{1,4}$|.{1,2}$|.{1,6}', 'g')).join("-"); 
    $(this).val(foo); 
}); 

私が期待するように動作していないですが - 私はちょうど6のチャンクを取得します:http://jsfiddle.net/juspC/892/

私は間違って何をしていますか?

+1

詳細情報を提供できますか?サンプル入力とは何か、期待される出力は何ですか?あなたは「力ダッシュ」と言いますが、私が最初にすることはダッシュを取り除くことです。混乱します。 – dman2306

+0

@ dman2306 - 123456121234と入力すると、私は '123456-12-1234'を期待しています。 JSFiddleは私が今見ていることを示しています。キーアップを再評価できるように、ダッシュを削除します。 – SB2055

+0

なぜなら、 '|'は常にオプションの中で最長と一致するからです。なぜ正規表現を使うのですか?単純な 'substring'のようなものが私にはこれを非常に簡単に処理すると思われます。最初の6文字、次の2文字、次の4文字を拾います。また、FYIとして、あなたは数字を強制する何もしていないので、*&^&* $#^&* $ ^#&*^$#は機能し、誰かがペーストしたり、テキストをドラッグしたりすると、フィールドに入る。 – dman2306

答えて

1

IE9 +をサポートできる場合は、input eventの使用をお勧めします。そうでない場合は、ライブラリを使用する必要があります。 Input Maskはかなりよく見えます。

$('form input').on('input', function(e) { 
 
    // get just the number 
 
    var numeric = this.value.replace(/-/g, ''); 
 
    // split it by number of numeric characters 
 
    split = numeric.match(/^(\d{0,6})(\d{0,2})(\d{0,4})/); 
 
    // shift off the whole match 
 
    split.shift(); 
 
    // join back up using dashes and trim trailing and leading dashes 
 
    this.value = split.join('-').replace(/^\-+|\-+$/, ''); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form> 
 
    <input type='text' maxlength="14"/> 
 
</form>

編集:あなたはこの事にすべてES6を取得したい場合、あなたはまた、9行目の代わりに、奇妙な正規表現置換するために次の操作を行うことができます。

this.value = split.filter(a=>a).join('-'); 
+0

IE8も必要な場合、MSイベント 'propertychange'は' e.originalEvent.propertyName == "value" 'を見ている限り同じ情報を提供します。 – dman2306

+0

@ dman2306 Nice!イベントリスナー内の値を変更するとうまくいきますか?それは無限ループに襲われますか? –

+0

いいえ、残念なことに無限ループを防ぐために独自のコードを追加する必要があります。あなたはIE8のサポートが必要な場合、すべてのケースを網羅する唯一のものです。 – dman2306

関連する問題