[EDIT: Tôi đã để lại bài đăng này cho thông tin về nhóm chụp nhưng giải pháp chính tôi đưa ra là không chính xác.
(?:START)((?:[^S]|S[^T]|ST[^A]|STA[^R]|STAR[^T])*)(?:END)
như được chỉ ra trong các nhận xét sẽ không hoạt động; Tôi đã quên rằng các ký tự bỏ qua không thể bị loại bỏ và do đó bạn sẽ cần một cái gì đó như ... |STA(?![^R])|
để vẫn cho phép ký tự đó là một phần của END, do đó không thành công trên một cái gì đó như STARTSTAEND; vì vậy nó rõ ràng là một lựa chọn tốt hơn; sau đây sẽ hiển thị đúng cách để sử dụng các nhóm chụp ...]
Câu trả lời được đưa ra bằng cách sử dụng toán tử 'lookahead' không có chiều rộng bằng 0 ''!, với các nhóm chụp, là: (?:START)((?!.*START).*)(?:END)
. sử dụng $ 1 để thay thế. Nếu bạn muốn bắt các thẻ START và END, bạn có thể thực hiện (START)((?!.*START).*)(END)
, cung cấp $ 1 = START $ 2 = văn bản và $ 3 = END hoặc các hoán vị khác bằng cách thêm/xóa ()
s hoặc ?:
s.
Bằng cách đó nếu bạn đang sử dụng nó để thực hiện tìm kiếm và thay thế, bạn có thể thực hiện, chẳng hạn như BEGIN $ 1FINISH. Vì vậy, nếu bạn bắt đầu với:
abcSTARTdefSTARTghiENDjkl
bạn sẽ nhận được ghi
như chụp nhóm 1, và thay thế bằng BEGIN $ 1FINISH sẽ cung cấp cho bạn như sau:
abcSTARTdefBEGINghiFINISHjkl
mà sẽ cho phép bạn để thay đổi mã thông báo START/END chỉ khi được ghép nối đúng cách.
Mỗi (x)
là một nhóm, nhưng tôi đã đặt (?:x)
cho mỗi người trong số những người ngoại trừ giữa đánh dấu nó là một nhóm không bắt; người duy nhất tôi rời đi mà không có ?:
là giữa; tuy nhiên, bạn cũng có thể nắm bắt được các thẻ BEGIN/END cũng như nếu bạn muốn di chuyển chúng xung quanh hoặc những gì bạn có.
Xem Java regex documentation để biết chi tiết đầy đủ về các regex của Java.
Điều gì xảy ra nếu văn bản là 'abcSTARTabcENDabcSTARTabcENDabc'? Bạn có muốn cả hai trận đấu? –
không nghĩ về điều đó ... dù sao, tôi có thể tìm thấy trận đấu thứ hai nếu cần thiết. – rrr
Tốt hơn để làm điều đó trong một regex duy nhất. Tôi đã thêm một câu trả lời. –