RegEx Geribaşvurularda

6 Cevap php

: Şu normal ifadeyi sahip

([a-z])([0-9])\1

Bu a5a, o da, a5b, a5c, a5d maç ve için herhangi bir yolu var mı maçları?


EDIT: Tamam, ben sadece ([a-z])([0-9])([a-z]) kullanabilirsiniz anlıyorum ama çok uzun ve karmaşık bir düzenli ifade (eşleşen sub-sub-sub-...-domains var ya {[(3)] }) Bu gerçekten yukarıda tarif edilen davranışı yararlı olacaktır. Bu Geribaşvurularda veya başka bir şey ile ulaşmak mümkün nasılsa mı?


Anon. cevap ne ihtiyacım olduğunu, ancak bu hatalı gibi görünüyor.

6 Cevap

Ikinci mektup ilk bağımsız ise, sağ başvuruları geri gerekmez?

([a-z])([0-9])([a-z])+

EDIT

Sadece o zaman, tekrar tekrar son bölümünü tekrarlamak istemiyorsanız:

([a-z])([0-9])([a-z])

Sadece '+' götürüp.

Cevap not with backreferences

Geribaşvuru önceden eşleşen değerin eşleşmesi anlamına gelir. Bu önceki ifadesini maç anlamına gelmez. Ama dil izin verirse bunu derleme önce ifade bir dize bir değişkeni yerini alabilir.

Tcl:

set exp1 "([a-z])"
regexp "${exp1}([0-9])${exp1}+" $string

Javascript:

var exp1 = '([a-z])';
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+');
string.match(regexp);

Perl:

my $exp1 = '([a-z])';
$string =~ /${exp1}([0-9])${exp1}+/;

Düzenli bir ifadede bir arka referans bütün mesele belirtilen alt-ifade olarak aynı şeyi maç için, yani bu davranışı devre dışı bırakmak için hiçbir yolu yoktur.

Daha sonra bir düzenli ifadenin bir bölümünü yeniden edememek, sadece çalışıyorsanız dile bağlı (ayrı bir dize yeniden isteyen düzenli ifadenin parçaları tanımlamak, ve olabilir, istediğiniz davranışı almak için ) parçalardan düzenli ifade oluşturmak için dize enterpolasyon veya birleştirme kullanın.

Örneğin, Ruby:

>> letter = '([a-z])'
=> "([a-z])"
>> /#{letter}([0-9])#{letter}+/ =~ "a5b"
=> 0
>> /#{letter}([0-9])#{letter}+/ =~ "a51"
=> nil

Veya JavaScript:

var letter = '([a-z])';
var re = new RegExp(letter + '([0-9])' + letter + '+');
"a5b".match(re)

Ben (sadece yineleme için değil ;) (?PARNO) inşa Perl benzer bir şey isteyen konum şüpheleniyoruz.

/([a-z])([0-9])(?1)+/

ne istediğinizi maç olacak - ve ilk yakalama grubuna herhangi bir değişiklik ne (?1) maçta yansıyacaktır.

Ben sorunuzu takip etmiyorsun?

[a-z][0-9][a-z] Exactly 1
[a-z][0-9][a-z]? One or 0
[a-z][0-9][a-z]+ 1 or more
[a-z][0-9][a-z]* 0 or more

Geribaşvurularla regex önceki veri alma ve daha sonra bunu kullanmak için vardır. Onlar üslup sorunları tespit için değil. Geribaşvurularda ile bir regex olmadan biri olarak çalışmayacaktır. Sadece regexes tekrarlayan ve çirkin olmaya alışması gerekebilir.

Belki de kolay kadar küçük bloklardan Regexes kurmak için yapar, Python deneyin. Eğer ortamı değiştirmek için izin eğer net değil ... Eğer ilk etapta geribaşvuruları olduğu için şanslısın.