2017-02-24 7 views
2

この例ではn = 4です。長さnの連続する数字のすべてを一致させる

私はRegexの新機能で、20分前に検索しました。そこにいくつかの便利なウェブサイトがありますが、物事を単純化するが、私はこれを進める方法を考えることができません。

私はこのから4つの連続した数字のすべての組み合わせを抽出したい:取得する

12345 

1234 - possible with ^\d{4}/g - Starts at the beginning 
2345 - possible with \d{4}$/g - Starts at the end 

をしかし、私は両方を取得することはできません!入力は任意の長さにすることができます。

答えて

2

あなたの式は、これら二つのサブ文字列が重複しているので、期待通りに動作しないを参照してください。

長さがゼロのアサーションとは別に、入力文字列内の任意の文字が一致プロセスで消費され、重複する一致が見つからないという結果になります。

これを回避するには、先読みとキャプチャグループを使用して、重複する一致を取得します。これは、先読みアサーション(lookbehindアサーションと同様)が長さゼロのアサーションに分類されているために機能します。これは、マッチを消費しないことを意味します。重複する一致を見つけることができます。ここで

(?=(\d{4})) 

は、迅速なスニペットは、これを実証している:

var regex = /(?=(\d{4}))/g; 
 
var input = '12345678'; 
 
var match; 
 

 
while ((match = regex.exec(input)) !== null) { 
 
    if (match.index === regex.lastIndex) { 
 
     regex.lastIndex++; 
 
    } 
 
    
 
    console.log(match[1]); 
 
}

+0

ありがとうございます。私はちょうど[この質問](http://stackoverflow.com/questions/42456201/what-should-the-javascript-match-regex-function-return)に一致を返すのに問題があると尋ねました。長さがゼロのことについて私が少し頭を上げたが、どうして私が奇妙な結果を得ているのかを説明するかもしれない。編集:私はあなたのコードを使用していないことを明確にする必要があります何らかの理由で無限ループに終わった。 – DaveHolt

1

あなたはキャプチャグループと先読みを使用することができます。

(?=(\d{4})) 

demo

0

使用して、あらゆる可能性を持つ先読みアサーションを
(?=(0123|1234|2345|3456|4567|5678|6789))

(?= 
     (       # (1 start) 
     
     | 1234 
     | 2345 
     | 3456 
     | 4567 
     | 5678 
     | 6789 
    )        # (1 end) 
) 

出力

** Grp 0 - (pos 0 , len 0) EMPTY 
** Grp 1 - (pos 0 , len 4) 
1234 

------------------ 

** Grp 0 - (pos 1 , len 0) EMPTY 
** Grp 1 - (pos 1 , len 4) 
2345 
+0

これは実際には機能しますが、すべての可能な結果を​​事前に把握していることを前提としています。私の状況では、入力はランダム/予測不能になる可能性があります。 – DaveHolt

+0

@DaveHolt - ちょっとしたパートナー、私は 'すべての4桁の数字の組み合わせ 'は、隣接する桁が文字+/- 1のコードであることを意味します。そうでない場合、_consecutive_は_combination_という用語とともに使用されても特別な意味を持ちません。これは単純に文字クラス '[0-9]'です。説明に_unique_を追加すると、それはまったく異なるものです。 – sln

+0

また、ちょうどコメント。これらの答えはすべて、重複した検索を使用します。これは新しいことではありませんが、方法論はほとんど理解または記述されていません。 – sln

関連する問題