Toán tử AND / OR được biểu diễn như thế nào trong Biểu thức chính quy?


219

Tôi hiện đang lập trình một thuật toán từ vựng để kiểm tra xem người dùng đã nhập từ đúng chưa. Tôi có tình huống sau: Giải pháp chính xác cho từ sẽ là "part1, part2". Người dùng sẽ có thể nhập "part1" (câu trả lời 1), "part2" (câu trả lời 2) hoặc "part1, part2" (câu trả lời 3). Bây giờ tôi cố gắng khớp chuỗi do người dùng cung cấp với biểu thức regex sau đây, được tạo tự động:

^(part1|part2)$

Điều này chỉ trả về câu trả lời 1 và 2 là chính xác trong khi câu trả lời 3 sẽ sai. Bây giờ tôi đang tự hỏi liệu có một nhà điều hành tương tự như | mà nói and/orthay vì either...or.

Ai có thể giúp tôi giải quyết vấn đề này?


1
Biểu thức chính quy có thể không phải là giải pháp tốt nhất cho việc này. Tôi sẽ sử dụng các phương thức chuỗi bình thường.
Felix Kling

3
Vấn đề này được chỉ định kém. Tại sao bạn sử dụng khớp mẫu khi tất cả những gì bạn cần là so sánh chuỗi chính xác với một chuỗi các chuỗi hợp pháp? Trừ khi trình biên dịch regex của bạn tối ưu hóa các lựa chọn thay thế thành cấu trúc trie O (1) theo cách của Perl, có lẽ bạn nên thực hiện một thử nghiệm chống lại thành viên băm thay thế. Các công cụ regex khác không thông minh lắm.
tchrist

@tchrist Trường hợp sử dụng có thể là một $ortrận đấu regex mongodb
Nadir Abbas

Câu trả lời:


283

Tôi sẽ giả định rằng bạn muốn xây dựng một regex một cách linh hoạt để chứa các từ khác ngoài part1 và part2, và rằng bạn muốn thứ tự không thành vấn đề. Nếu vậy bạn có thể sử dụng một cái gì đó như thế này:

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

Trận đấu tích cực:

part1
part2, part1
part1, part2, part3

Trận đấu tiêu cực:

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

4
Lưu ý rằng "part1, part" 1 cũng sẽ dương. Điều không phải lúc nào cũng mong muốn
dimaaan

1
@dimaaan Bạn đã đặt sai dấu ngoặc kép của bạn? "part1, part1" sẽ là một trận đấu, nhưng "part1, part" sẽ không như vậy. Mặc dù bạn đúng rằng kịch bản như vậy không được giải quyết trong giải pháp này, nhưng đối với ứng dụng của OP nơi anh ấy kiểm tra xem chuỗi kiểm tra có bao gồm các từ trong từ vựng hay không, tôi tin rằng anh ấy muốn có một kết quả trùng khớp ngay cả khi một từ là lặp đi lặp lại. Từ này vẫn sẽ là một phần của từ vựng cho dù bạn có bao nhiêu từ.
Gaute Løken

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

nó có hoạt động không


1
Chắc chắn. regex yêu cầu toàn bộ chuỗi khớp (^, $)
thủy tinh

5

Điều này làm việc mà không có sự thay thế?

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

hoặc tại sao không phải điều này?

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

Cái đầu tiên hoạt động cho tất cả các điều kiện thứ hai cho tất cả nhưng part2(sử dụng GNU sed 4.1.5)


4

Không phải là một chuyên gia về regex, nhưng bạn có thể làm được ^((part1|part2)|(part1, part2))$. Trong các từ: "phần 1 hoặc phần 2 hoặc cả hai"


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.