2016-01-31 23 views
5

Bir RegEx'in dizenin başına geri düşmesi ve eşlemeye yeniden başlaması mümkün mü?RegEx'in başlangıcına geri dönme RegEx

İşte bu yüzden soruyorum. Aşağıdaki dize verildiğinde, konu dizesinde oluşma sırasına bakılmaksızın ve yalnızca konu dizesinde tüm alt dizeler mevcutsa, alt sıraları black, red, blue ve green yakalamak istiyorum. Bir yoksa

$str ='blue-ka93-red-kdke3-green-weifk-black'

Yani, aşağıda dizelerinin tamamına ait, RegEx acaba

'blue-ka93-red-kdke3-green-weifk-black' 
'green-ka93-red-kdke3-blue-weifk-black' 
'blue-ka93-black-kdke3-green-weifk-red' 
'green-ka93-black-kdke3-blue-weifk-red' 

(bu sırayla) black, red, blue ve green çekmeligüvenli Bir yakalama grubunu eşleştirmenin yolu daha sonra dizenin başına dönecek ve bir sonraki yakalama grubunu bulacaktır. ^.*(?=(black))^.*(?=(red))^.*(?=(blue))^.*(?=(green)) gibi bir işin çalışacağını umuyorum ama elbette ^ ve lookaheads bu şekilde davranmıyor.

Böyle bir RegEx oluşturmak mümkün mü?

Bağlam için, PHP'de RegEx'i kullanacağım.

+3

: (?. = * (Siyah))?. [ '^ (?. = * (Kırmızı)) (?. = * (Mavi)) (= * (yeşil)) '] (https://regex101.com/r/qB0bR5/1)? Bu, tüm bu anahtar kelimelerin dizede olmasını gerektirir. –

+0

@ WiktorStribiżew Yep, aynen böyle, bir cevap olarak at ve kabul edeceğim, teşekkürler! – DelightedD0D

+0

@ WiktorStribiżew: Lütfen cevabınızdaki her adımı detaylandırın. –

cevap

3

Sen

^(?=.*(black))(?=.*(red))(?=.*(blue))(?=.*(green)) 

Not kullanabilirsiniz: Bu dizede olmak tüm bu anahtar kelimeleri gerektirecektir.

eşleşen zaman, bu nedenle, sadece başında demirlemiş olumlu lookahead içindeki mekanizmayı yakalama kullanabilirsiniz RegEx endeksi sıfırlamak için bir yolu yoktur demo

bakınız. Lookahead, dize başlangıcında boş bir konumla eşleşecektir (^ nedeniyle) ve yukarıdaki RegEx'teki her bir tokyo gösterici, bir öncekinin doğru döndüğü zaman birbiri ardına yürütülür (desenini karşılayan bir metin dizesi bulunur).

RegEx'iniz eşleştiği için aynı şekilde çalışmadı, metni .* ile harcadı (bu alt şablonlar lookah'ların dışındaydı) ve çok satırlı bir değiştirici kullanmazsanız otomatik olarak bir RegEx'i başarısız kılan dize bağlantısı başlatılıyordu.

1

Siparişi korumak için neden sadece capture groups'u kullanmayın.

^(?:(black)|(red)|(blue)|(green)|.)+$ 

Bu, herhangi bir dizeyle eşleşecektir, tüm renkler isteğe bağlıdır.

See demo at regex101 veya bu gibi php demo at eval.in

+1

altındaki çözümü kullanarak benim gerçek regex için aslında tüm desenlerin mevcut kullanımımda mevcut olmasını sağlamalıyım ama müthiş bir isteğe bağlı eşleşme çözümü için +1 – DelightedD0D

İlgili konular