Tôi có thể sử dụng OR trong regex mà không chụp những gì kèm theo không?


115

Tôi đang sử dụng rubular.com để tạo regex của mình và tài liệu của họ mô tả những điều sau:

(...)   Capture everything enclosed
(a|b)   a or b

Làm cách nào để sử dụng biểu thức OR mà không nắm bắt được những gì trong đó? Ví dụ: giả sử tôi muốn chụp "ac" hoặc "bc". Tôi không thể sử dụng regex

(a|b)(c)

đúng? Kể từ đó tôi chụp "a" hoặc "b" trong một nhóm và "c" trong nhóm khác, không giống nhau. Tôi biết mình có thể lọc qua các kết quả đã chụp, nhưng điều đó có vẻ như nhiều công việc hơn ...

Tôi có thiếu một cái gì đó rõ ràng không? Tôi đang sử dụng điều này trong Java, nếu điều đó là thích hợp.


Nice one 1 cho các liên kết đến Rubular
Bukowski

Câu trả lời:


181

Tùy thuộc vào việc triển khai biểu thức chính quy, bạn có thể sử dụng cái gọi là nhóm không nắm bắt với cú pháp (?:…):

((?:a|b)c)

Đây (?:a|b)là một nhóm nhưng bạn không thể tham khảo trận đấu của nó. Vì vậy, bạn chỉ có thể tham khảo kết quả phù hợp của ((?:a|b)c)đó là achoặc bc.


đã làm được điều đó! Cảm ơn vì phản hồi cực nhanh. Tôi sẽ chấp nhận sau khi thời hạn (mà tôi không biết là đã tồn tại) hết hạn.
goggin

4
Tôi nghĩ ý tưởng không phải là để nắm bắt ahoặc bở tất cả. Nói cách khác, để phù hợp ac hay bc, nhưng chỉ chụp các c:(?:a|b)(c)
Alan Moore

1
@AlanMoore Có thể nắm bắt một cái chứ không phải cái kia trong câu lệnh hoặc không? Vì vậy, tôi đang tìm mẫu achoặc ab, nhưng tôi muốn xuất ra abnếu abvà chỉ 'c' là đầu ra là 'ac'.
Moondra

24

Nếu triển khai của bạn có nó, thì bạn có thể sử dụng dấu ngoặc đơn không bắt:

(?:a|b)

@mmutz Cảm ơn bạn đã phản hồi nhanh chóng! Tôi ước gì có thể chấp nhận cả hai câu trả lời, đã được chỉ là những gì tôi đang tìm kiếm
goggin13

3

Ngay cả rubular cũng không khiến bạn sử dụng dấu ngoặc đơn và mức độ ưu tiên của |nó thấp. Ví dụ a | bc không khớp với ccc


toán tử '! ~' làm gì? Tôi thích cách thể hiện của bạn, với ít parens hơn, regex đã đủ lộn xộn rồi
goggin

! ~ là một từ ngữ toàn vẹn cho "không khớp", tôi viết cẩu thả; đã sửa, cảm ơn.
msw

2
Tôi không hiểu bạn. Các ưu tiên thấp |là lý do tại sao bạn làm phải Parens sử dụng. (?:a|b)ckhớp achoặc bc(hành vi mong muốn), trong khi a|bckhớp ahoặc bc.
Alan Moore,

2

Nếu các lựa chọn thay thế HOẶC của bạn đều là các ký tự đơn - bạn chỉ có thể sử dụng toán tử "bộ ký tự":

([ab]c)

nó sẽ chỉ khớp achoặc bcvà nó dễ đọc hơn.

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.