AND / OR operatörü Normal İfadelerde olduğu gibi nasıl temsil edilir?


220

Şu anda bir kullanıcının kelimeyi doğru yazıp yazmadığını kontrol eden bir kelime algoritması programlıyorum. Aşağıdaki durum var: kelime için doğru çözüm "part1, part2" olacaktır. Kullanıcı "bölüm1" (yanıt 1), "bölüm2" (yanıt 2) veya "bölüm1, bölüm2" (yanıt 3) girebilmelidir. Şimdi kullanıcı tarafından verilen dize, otomatik olarak oluşturulan regex ifade ile eşleştirmeye çalışın:

^(part1|part2)$

Bu sadece cevap 1 ve 2'yi doğru olarak döndürürken cevap 3 yanlış olur. Şimdi benzer bir operatör olup olmadığını merak ediyorum | and/oryerine diyor either...or.

Birisi bu sorunu çözmeme yardımcı olabilir mi?


1
Düzenli ifadeler bunun için en iyi çözüm olmayabilir. Normal dize yöntemlerini kullanırdım.
Felix Kling

3
Bu sorun yetersiz belirtilmiş. İhtiyacınız olan tek şey bir dizi yasal dizeyle tam bir dize karşılaştırması olduğunda neden desen eşleştirme kullanıyorsunuz? Regex derleyiciniz, Perl'lerin yaptığı gibi O (1) trie yapısına alternatifleri optimize etmedikçe, bunun yerine karma üyeliğe karşı bir test yapmalısınız. Diğer regex motorları bu konuda çok akıllı değil.
tchrist

@tchrist Kullanım durumu bir mongodb $orregex maçı olabilir
Nadir Abbas

Yanıtlar:


284

Part1 ve part2'den başka kelimeler içerecek bir regex'i dinamik olarak oluşturmak istediğinizi ve siparişin önemli olmamasını istediğinizi varsayacağım. Eğer öyleyse böyle bir şey kullanabilirsiniz:

((^|, )(part1|part2|part3))+$

Olumlu maçlar:

part1
part2, part1
part1, part2, part3

Negatif eşleşmeler:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

4
"1. bölüm, 1. bölüm" 1'in de olumlu olacağını unutmayın. Hangi her zaman arzu edilmez
dimaaan

1
@dimaaan Alıntılarınızı yanlış mı koydunuz? "part1, part1" bir eşleşme olacak, ancak "part1, part" eşleşmeyecek. Böyle bir senaryonun bu çözüm tarafından kapsanmadığından emin olsanız da, test dizesinin bir sözcük dağarcığındaki kelimelerden oluşup oluşmadığını kontrol ettiği OP'nin uygulanması için, bir kelime olsa bile olumlu bir eşleşme istediğine inanıyorum tekrarladı. Kelime, kaç örneği olursa olsun, kelime dağarcığının bir parçası olmaya devam edecektir.
Gaute Løken

30
'^(part1|part2|part1,part2)$'

çalışıyor mu?


1
Açıkçası. normal ifade tüm dizenin eşleşmesini gerektirir (^, $)
glasspill

5

Bu değişmeden çalışır mı?

^((part)1(, \22)?)?(part2)?$

ya da neden olmasın?

^((part)1(, (\22))?)?(\4)?$

Birincisi tüm koşullar için, ikincisi herkes için çalışır part2(GNU sed 4.1.5 kullanarak)


4

Normal ifade konusunda uzman değil, yapabilirsiniz ^((part1|part2)|(part1, part2))$. Kelimeyle: "bölüm 1 veya bölüm2 veya her ikisi"


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.