Bagaimana operator AND / OR diwakili dalam Ekspresi Reguler?

219

Saat ini saya sedang memprogram algoritma kosa kata yang memeriksa apakah pengguna mengetik kata dengan benar. Saya memiliki situasi berikut: Solusi yang tepat untuk kata itu adalah "part1, part2". Pengguna harus dapat memasukkan "part1" (jawaban 1), "part2" (jawaban 2) atau "part1, part2" (jawaban 3). Sekarang saya mencoba untuk mencocokkan string yang diberikan oleh pengguna dengan ekspresi regex berikut yang dibuat secara otomatis:

^(part1|part2)$

Ini hanya mengembalikan jawaban 1 dan 2 sebagai benar sedangkan jawaban 3 salah. Saya sekarang bertanya-tanya apakah ada operator yang mirip dengan | yang mengatakan and/orbukannya either...or.

Adakah yang bisa membantu saya mengatasi masalah ini?

Jonathan
sumber
1
Ekspresi reguler mungkin bukan solusi terbaik untuk ini. Saya akan menggunakan metode string normal.
Felix Kling
3
Masalah ini tidak ditentukan secara spesifik. Mengapa Anda menggunakan pencocokan pola ketika semua yang Anda butuhkan adalah perbandingan string yang tepat terhadap serangkaian string hukum? Kecuali jika kompiler regex Anda mengoptimalkan alternatif menjadi O (1) struktur trie seperti Perl, Anda mungkin harus melakukan tes terhadap keanggotaan hash sebagai gantinya. Mesin regex lain tidak begitu pintar dalam hal ini.
tchrist
@tchrist Kasus penggunaan bisa menjadi pertandingan mongodb $orregex
Nadir Abbas

Jawaban:

283

Saya akan berasumsi bahwa Anda ingin membuat regex secara dinamis mengandung kata-kata selain part1 dan part2, dan Anda ingin agar tidak menjadi masalah. Jika demikian, Anda dapat menggunakan sesuatu seperti ini:

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

Pertandingan positif:

part1
part2, part1
part1, part2, part3

Pencocokan negatif:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
Gaute Løken
sumber
4
Perhatikan bahwa "part1, bagian" 1 juga akan positif. Yang tidak selalu diinginkan
dimaaan
1
@dimaaan Apakah Anda salah menempatkan kutipan? "part1, part1" akan cocok, tapi "part1, bagian" tidak akan. Meskipun Anda benar bahwa skenario seperti itu tidak tercakup oleh solusi ini, untuk aplikasi OP di mana dia memeriksa apakah test-string terdiri dari kata-kata dalam kosakata, saya percaya dia memang menginginkan kecocokan positif bahkan ketika sebuah kata adalah ulang. Kata itu masih akan menjadi bagian dari kosakata tidak peduli berapa banyak contoh yang Anda miliki.
Gaute Løken
30
'^(part1|part2|part1,part2)$'

Apakah itu bekerja?

Kent
sumber
1
Jelas sekali. regex membutuhkan seluruh string agar sesuai (^, $)
glasspill
5

Apakah ini berfungsi tanpa pergantian?

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

atau mengapa tidak?

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

Yang pertama bekerja untuk semua kondisi yang kedua untuk semua tetapi part2(menggunakan GNU sed 4.1.5)

potong
sumber
4

Bukan ahli dalam regex, tetapi Anda bisa melakukannya ^((part1|part2)|(part1, part2))$. Dengan kata: "bagian 1 atau bagian2 atau keduanya"

Beruang hitam
sumber
2

Atau Anda dapat menggunakan ini:

^(?:part[12]|(part)1,\12)$
FailedDev
sumber