2016-05-10 4 views
1

数字の文字列を3つのチャンクに分割する必要がありますが、チャンクに1つの数字だけを含めることはできません。 。ストリングを3つのチャンクに分割しますが、最小のカウントは2つです

[123],[456],[7]例えば

- これが受け入れ可能な解決

である私はほとんどそこに持っているが、私はないよ - 7はそれ自身の

[123],[45],[67]に残されているので、これは受け入れられません少なくとも2桁の数字があることを確認してください。ここで

はダウン三つの部分に文字列を破るが、最小桁数を考慮していない私のソリューションです:

function solution(s) { 
    var number = s.replace(/\D/g, ''); 
    number = number.match(/.{1,3}/g); // breaks down into threes 
    number = number.join('-'); 
    return number; 
} 

ここでのアクションでそれを見るためにcodepenます:http://codepen.io/franhaselden/pen/mPobNb

答えて

2

あなたはルックアヘッドで正規表現を使用することができます。

Positive Lookaheadは、等号の後にパターンを探しますが、一致するパターンには含まれません。 'X' は 'Y' が続いている場合にのみ

X(?= Y)

マッチ 'X'。これは先読みと呼ばれています。

たとえば、/Jack(?=Sprat)/は、「Sprat」の後にのみ「Jack」と一致します。 /Jack(?=Sprat|Frost)/は、 'Sprat'または 'Frost'の後にのみ 'Jack'と一致します。しかし、「Sprat」も「Frost」も一致結果の一部ではありません。

Online RegEx

function format(s) { 
 
    return s.toString().replace(/\d{2,3}(?=..)/g, '$&-'); 
 
} 
 

 
document.write(format(123456789) + '<br>'); 
 
document.write(format(12345678901) + '<br>'); 
 
document.write(format(1234567) + '<br>');

私は見つけられませんが、編集は、配列を経由して、余分なループが必要であることを、この提案はあなたにString#match()で指名手配のステップを与える

後でこの配列を次の正規表現で結合するために使用します。

/.{2,3}(?=..)|.+/g

  • 1stオルタナティブ:.{2,3}(?=..)

    • .{2,3}マッチ(改行を除く)任意の文字2と間
      Quantifier:{2,3}必要[greedy]

    • (?=..)肯定先読みとして恩返し回、できるだけ多くの回数は、 - (下の正規表現が
      .マッチ(改行を除く)任意の文字
      .は任意の文字に一致を一致させることができることをアサート改行を除く)

  • 2ndオルタナティブ:.+

    グローバル:3210
    • .+[greedy]
  • g modifierを必要に応じてバックを与える、(改行を除く)任意の文字oneunlimited時間の間
    Quantifier:+、できるだけ多くの回数に一致します。すべての試合(最初の一致には戻りません)

var a, i, s = ''; 
 

 
for (i = 1; i < 10; i++) { 
 
    s += i; 
 
    a = s.match(/.{2,3}(?=..)|.+/g); 
 
    document.write(a.join('-') + '<br>'); 
 
}

+0

おかげで、あなたは先読みを処理する部分だけにこれを打破することができますか?私はそれをどのように3つの異なる行に分解したのと同様です。それは、すべてを組み合わせて見るよりも、私が学ぶ方が簡単です。 – user1486133

+0

また、私はあなたのソリューションを試して、それは右ではない文字列の最後の2つの数字を削除します。すべての番号を含める必要があります:http://codepen.io/franhaselden/pen/mPobNb – user1486133

+0

上記の私の提案のように、あなたは 'replace'の代わりに' match'を使用しています。 'match'は、マッチした部分だけを返します。あなたのケースでは、私は 'replace'を使って1ステップでそれをやります。 –

関連する問題