2016-04-05 37 views
1

BenNormal İfade eşsiz sonuç

(?:(da|en-gb|en|\*))(?!.*\1) 

Ne almak istiyorum eşsiz dil-türüne ayarlayın bir normal ifade var;

Örneğin, ben bu eski iki en tekrarlanan çünkü benim istediğim şey, enenen-gben maç parçası en-gben olduğunu verir.

Ancak ben neden enen-gb de bir alt olduğunu düşünüyorum, ne almak için ne enenenen-gb maç parçası en-gb olduğunu enen-gb olduğunu verdiğinde. Ama nasıl tamir edeceğimi bilmiyorum. Bana daha iyi bir RE verebilir mi? Çok teşekkürler

=================== güncelleme ==============

soru arka plan http - kabul dilinin üstbilgisi için bir Regex tasarlamak istiyorum. Bu yüzden (?:(da|en-gb|en|\*))(?!.*\1)(;q=(1|0(\.\d+)?))?(,(da|en-gb|en|\*)(;q=(1|0(\.\d+)?))?)* kullanıyorum da, en-gb, en sadece bazı örneklerdir. Biliyorsunuz, her dile öncelikini temsil etmek için bir q değeri verilebilir. Ve tekrarlanan herhangi bir dil türü olmasını umuyorum. İstediğim bu.

+0

@anubhava Bu soruyu kullandığınız dille ilgili olarak düşünmüyorum. Farklı dil türlerini temsil etmek için sadece bir regex tasarlıyorum. Aslında, durum şu ki, dil türlerini belirledim ve bunları tekrarlayanlar olmadan regex kullanarak temsil etmek istiyorum. –

+0

['(?: (Da | en-gb | tr | \ *)] 'ı (?!. * \ 1 (?! -))']' ı (https://regex101.com/r/mN6qR7/1) deneyin. . –

+0

@ WiktorStribiżew Bu işe yaramıyor. Bunu denedin mi? –

cevap

1
Haklısınız yinelenen dil adından sonra bir tire yok etmek eşleşmeleri kısıtlamak için geribaşvuruların sonra (?!-) Negatif ilerleme kullanabilirsiniz

:

(?:(da|en-gb|en|\*))(?!.*\1(?!-))(?:;q=(?:1|0(\.\d+)?))?(?:,(da|en-gb|en|\*)(?!.*\3(?!-))(?:;q=(?:1|0(?:\.\d+)?))?)* 
        ^^^^^^^^^^^^^           ^^^^^^^^^^^^^ 

regex demo

- varsa, bu alt dize eşleştirilmeyecektir.

0

Düşünebildiğim bir düzelti en'u en-us olarak değiştirerek İngilizceye benzeyen en-gb türünün İngilizcesi, bir önceki Amerikan İngilizcesi olmalıdır.

Eğer bunun için uygun değilse, bu aşağıdaki gibi çalışabilir.

Regex:(en-gb|en-us|da)(?!\1)(en-gb|en-us|da)

Regex101 Demo

+0

Teşekkürler, ama ben 'tr'' tr-us' değiştirmezseniz herhangi bir çözüm var mı. Sormak istediğim bir başka şey ise '(?! \ 1)' yi '(?!) Kullanırken kullandığınızı fark ettim.* \ 1) 'tekrarlamadığı için. Lütfen aralarındaki farkı söyler misiniz? Many Thanks –

+0

'..' 'Kullandığınızda,' eşleştirilmiş ve tekrarlanan dize arasında 'sıfır' veya 'çok 'karakterler olabileceği anlamına gelir. Umarım art arda tekrarlanan dizgiyi eşleştirmek istersiniz. Bu durumda eşleşen dize ve takip eden dize aralarında herhangi bir karakter olmadan ardışık olmalıdır. –

+0

Eğer 'tr'' en-us' değiştirmezseniz, 'tr'' tr-'tr-gb''nin tekrarlamasını alt-dize olarak düşünür ve bunu 'tr' olarak tekrar eder. –