2016-03-23 13 views

cevap

7

Sen (?=(\d{4})) regex kullanmak gerekir örtüşen eşleşmeleri eşleştirmek için.

tüm metin 4 haneli parçalarını tüketiyor kullandığınız regex demo

Regexes bakın ve böylece üst üste binen değerleri ile uyumlu değilse. (?=...) pozitif lookahead ile, bu 4 haneli parçalar sonra yere regex motoru işaretçisi hareket ettirmeden karakter tüketen (yani olmadan giriş dizesi içindeki her konumunu ve yakalama bu konumlardan 4 haneli parçalarını test edebilirsiniz).

enter image description here

C# demo:

var data = "2345678901"; 
var res = Regex.Matches(data, @"(?=(\d{4}))") 
      .Cast<Match>() 
      .Select(p => p.Groups[1].Value) 
      .ToList(); 
Console.WriteLine(string.Join("\n", res)); 
+0

Şimdi bunun çalıştığını biliyoruz, ne anlama geliyor? –

+0

Ah! Güncelleme için teşekkürler. –

+0

Bu aslında istenen sonucu eşleşmiyor, ancak her kombinasyonla eşleşiyor ve bu eşleşme için bir yakalama grubuna koyar ... Evet, işe yarıyor ve bir göz atmaksızın mümkün olduğunu sanmıyorum, ama bu çok değerli bir not. düşünüyorum. – Bikonja

2

kesinlikle normal ifadeyle kullanmam gerekir mi? Aynı işlem, basit bir döngü kullanılarak çok daha hızlı bir şekilde gerçekleştirilebilir.

private IEnumerable<string> getnums(string num) 
{ 
    for (int i = 0; i < num.Length - 3; i++) 
    { 
     yield return num.Substring(i, 4); 
    } 
} 

private IEnumerable<string> DoIt(string num) 
{ 
    var res = Regex.Matches(num, @"(?=(\d{4}))") 
       .Cast<Match>() 
       .Select(p => p.Groups[1].Value) 
       .ToList(); 
    return (IEnumerable<string>)res; 

} 

Basit döngü, RegEx sürümünün yaklaşık yarısını alır.

static void Main(string[] args) 
{ 

    var num = "2345678901"; 

    Stopwatch timer = new Stopwatch(); 

    timer.Start(); 
    foreach (var number in getnums(num)) 
    { 
     // Yum yum numbers 
    } 
    timer.Stop(); 
    Console.WriteLine(timer.Elapsed.Ticks); 

    timer.Reset(); 

    timer.Start(); 
    foreach (var number in DoIt(num)) 
    { 
     // Yum yum numbers 
    } 
    timer.Stop(); 
    Console.WriteLine(timer.Elapsed.Ticks); 
} 
+1

Yaklaşımınız için iyi bir karşılaştırma ve teşekkürler.Eğer sorunuzu cevaplarsam, Evet, Regex'i kullanmak gerekliydi. Çünkü soru, bir görevin sadece küçük bir parçası olduğu için, gerçekte - 1. 1000 dijit uzun sayı ile uğraşıyordum. 2. Asıl gereklilik, sıfır olmayan tüm 13 basamaklı sayıları elde etmekti. Bu yüzden değiştirilmiş Regex'im - ** @ "(? = ([1-9] {13}))" ** 3. Ve sonra bu sayılarla bazı görevler yapıyor. Regex ile gitmeyi seçmemin nedeni, sağladığı esneklik ve endişenin ayrılmasıdır. – Koder101

İlgili konular