2016-02-24 16 views

Trả lời

12

Từ trái sang phải và thay thế đầu tiên phù hợp "thắng", những người khác không được chọn. Đây là một hành vi regex điển hình của NFA. Mô tả tốt về hành vi đó được cung cấp tại regular-expressions.info Alternation page.

Lưu ý rằng RegexOptions.RightToLeft chỉ làm cho công cụ regex kiểm tra chuỗi đầu vào từ phải sang trái, công cụ sửa đổi không ảnh hưởng đến cách động cơ regex xử lý mẫu đó.

Hãy để tôi minh họa: nếu bạn có một regex (aaa|bb|a) và cố gắng tìm một trận đấu trong bbac sử dụng Regex.Match, giá trị bạn sẽ có được là bba thay thế xuất hiện sau khi bbb. Nếu bạn sử dụng Regex.Matches, bạn sẽ nhận được tất cả các kết quả phù hợp và cả hai số bba sẽ nằm trong kết quả của bạn.

Ngoài ra, thực tế là mẫu regex được kiểm tra từ trái sang phải làm rõ rằng bên trong một nhóm thay thế không được neo, thứ tự các lựa chọn thay thế là. Nếu bạn sử dụng một regex (a|aa|aaa) để đối sánh với abbccaa, thay thế a đầu tiên sẽ khớp với mỗi a trong chuỗi (xem regex demo). Khi bạn thêm các ranh giới từ, bạn có thể đặt các lựa chọn thay thế theo bất kỳ thứ tự nào (xem one more regex demo).

+0

Tôi nghĩ rằng có những động cơ regex luôn luôn có những trận đấu dài nhất, thay vì đầu tiên ở đây. – Joey

+2

Động cơ regex tuân thủ POSIX yêu cầu kết quả dài nhất. Ngoài ra, Perl6 '/ pattern1 | pattern2/'cũng khớp với giải pháp thay thế dài nhất (có một toán tử' || 'hoạt động như một' | 'đơn giản trong hầu hết các hương vị khác để tạo ra giải pháp thay thế đầu tiên). –

Các vấn đề liên quan