2013-06-17 15 views
6

RegExp benim bir dizi yakalama grubuna sahip olduğunda, hangi grubun yakalamayı yaptığını bilmek istiyorum (veya en az biri varsa, bu tür ilk gruptan en az biri). Python ile aşina iseniz, bu temelde re.MatchObject.lastgroup eşdeğeridir. Bazı kod daha anlaşılabilir olması için: gruplar yakalama yapılmışBir RegExp aramasında hangi grubun eşleştiğini verimli bir şekilde bulun

for at 1 [ undefined, 'for', undefined ] 
me at 5 [ undefined, undefined, 'me' ] 
20 at 8 [ '20', undefined, undefined ] 
boxes at 11 [ undefined, undefined, 'boxes' ] 
please at 17 [ undefined, undefined, 'please' ] 

result dizi gösterileri, ama hızla verilen her maç, grup için öğrenmek için hiçbir şekilde bakın:

var re_captures = new RegExp("(\\d+)|(for)|(\\w+)", "g"); 
var str = " for me 20 boxes please"; 
var result; 

while ((result = re_captures.exec(str)) !== null) { 
    console.log(result[0], 'at', result.index, result.slice(1)); 
} 

O yazdırır dizisini yinelemeden ile eşleşti. Bu, büyük regexlerin programlı olarak oluşturulduğu ve yinelemenin verimsiz olduğu durumlarda yararlı olur.

Belirgin bir şey eksik mi, ya da mümkün değil mi?

+1

Bunun mümkün olduğunu düşünmüyorum. Ama bu verimsiz hale geldiğinde tam olarak ne yapıyorsunuz? Büyük sonuçlara sahip büyük regeekslerden daha iyi bir çözüm olabilir. – Bergi

+0

@Bergi: Benim kullanımım, minimarkın yorumunu aşağıda minitech'in cevabına yaptım. –

+0

Bunun hile olduğunu biliyorum, ancak açıkça indekslemekten kaçınmak için 'indexOf' kullanabilirsiniz. Elbette, motor dahili olarak – user123444555621

cevap

2

Hiçbir şey kaçırmıyorsunuz; dizi boyunca yineleme tek yoldur.

Eşleşmeler arasında yinelenen, aslında bir performans sorunu olan kaç grup olabilir? Bir gruba ihtiyacınız yoksa, bunu her zaman yakalamadan yapabilirsiniz, ancak…

+0

Cevabınız için teşekkürler. Re performansı: Düzinelerce grupla oldukça uzun bir regex oluşturduğum bir kullanım durumum var. Kodun bu bölümü performansa duyarlı olduğundan, her bir eşleşme için bir dizi üzerinde yinelemek zorunda olmak utanç verici. Gerçekten merak ediyorsanız - https://gist.github.com/eliben/5797351 - regex tabanlı bir lexer, ve her şeyi büyük bir regex içine sokar. Ayrıca adlandırılmış gruplar kullanır, ancak bu gerekli değildir. Bununla birlikte, hangi grubun * eşleştiğini bilmek. –

+0

@EliBendersky: Her biri için farklı bir normal ifade yapabilir ve her birinin her seferinde eşleşip eşleşmediğini kontrol edebilirsiniz. Yine de daha hızlı olacağını düşünmüyorum. Genellikle JavaScript’te “el ile” ayrıştırıyorum, ancak genel yapmaya çalışıyorsanız bu işe yaramıyor, ha? = P – Ryan

+0

+ 1, muhtemelen burada çok sayıda regex kullanmış olurdum. Acaba bu (sizinki gibi, OP) görevinin daha iyi bir şekilde bölünemediğini, ilk kategorideki bazı kategorilerin tüm simgelerini toplayıp daha sonra tüm diğerlerini toplayamayacağını merak ediyorum. – raina77ow

İlgili konular