2016-02-24 10 views
5

Yakalama grubundaki bir sayının eşit veya ondan yüksek olduğu bir dizeyle eşleştirmek istiyorum.Numara aralığında arka referans kullanılabilir mi?

Örnek:

  • 1x1 = maç
  • 1x2 = maç
  • 2x1 = eşleşme
regex bu (\d)x[\1-9] gibi bir şey olur Zihnimde

ama bu değil iş. Bu regex kullanarak elde etmek mümkün mü?

+3

Normal ifade nedir? –

+0

Ben google analytics içinde hangi lezzet ne olduğunu emin değilim ama PCPRE – Frinsh

+2

Hayır, GA RE2 kullanır varsayalım kullanmayı deneyin. Yani saf regex ile yapmak mümkün değildir. –

cevap

2

keşfettiğiniz gibi, regex çünkü içinde bir değer interpole olamaz:

... sadece karakter sınıfı regex düğüm türüdür regex derlenmiş karakter sınıfları belirlenir Çünkü "sert regex derlendiğinde (karakterleri parçalandıktan sonra değil, 1 doların ne olabileceğini anladıktan sonra) oluşturulmuş karakterlerin kodlanmış listesi.

[Source] karakter sınıfları geribaşvuruları izin vermediği için, ardından bir dizi eğik çizgi bir karakter sınıfının yeniden oluşturulabilir edilir

:

iki ya da üç sekizlik rakam ile takip eden bir ters eğik çizgi sekizli sayı olarak kabul edilir.

[Source]

Bu tabii ki [\1-9] tarafından amaçlanan şey değildir. Ancak, tüm karakterler bilinene kadar bir karakter sınıfı derlemenin bir yolu olmadığından, başka bir yol bulmak zorundayız.

Bunu tamamen bir normal ifadeyle yapmak istiyorsak, olası tüm kombinasyonları sayamazız; çünkü hangisinin eşleştiğini anlamak için tüm yakalamaları kontrol etmek zorundayız. For example:

"1x2" =~ m/(?:(0)x(\d)|(1)x([1-9])|(2)x([2-9])|(3)x([3-9])|(4)x([4-9])|(5)x([5-9])|(6)x([6-9])|(7)x([7-9])|(8)x([89])|(9)x(9))/ 

ihtiva eder "1" $3 ve $4 yılında "2", ancak bir şey her zaman eşleşti olsaydı bulmak için 1 ila 20 yakalar aramak gerekir.


etrafında regex sonuçlarına sonrası işleme yapıyor tek yolu düzenli ifade koşullu kullanmaktır: (?(A)X)A koşullu olup X çıkan eylemdir yere.

Sadly conditionals are not supported by RE2, ancak sadece yapılabileceğini göstermek için devam edeceğiz. http://www.rexegg.com/regex-tricks.html#fail

Ne A için kullanmak isterdim ?{$1 > $2} ancak only Perl will allow you to use code directly in a regex şudur: X için kullanmak isteyeceğini söylesem

başarısızlığını zorlamak için (*F) (veya (?!) Ruby 2+) 'dir.

m/(\d)x(\d)(?(?{$1 > $2})(?!))/ 

[Live Example]

Yani sorunun cevabı: Perl kullanmak olanak sağlayacak "Hayır, Google Analytics kullanan re2 ile bunu yapamaz, ama evet Yapabileceğiniz Bu bir Perl regex ile. "