Một số phản ứng khác đã đề nghị sử dụng một regex mà không phụ thuộc vào lookbehinds, nhưng 1 suy nghĩ hoàn toàn, ví dụ làm việc là cần thiết để có được điểm qua. Ý tưởng là bạn phù hợp với toàn bộ chuỗi ("Nghiên cứu" cộng với chữ tiếp theo) theo cách thông thường, sau đó sử dụng một nhóm chụp để cô lập các phần mà bạn quan tâm. Ví dụ,
String s = "Lorem ipsum dolor sit amet, consectetur " +
"adipiscing elit. Nunc eu tellus vel nunc pretium " +
"lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
"a libero quis risus sollicitudin imperdiet.";
Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
System.out.println(m.group(1));
}
Lưu ý rằng điều này sẽ in cả "thông minh" và "bây giờ". Để làm điều đó với phiên bản lookbehind, bạn sẽ phải làm một cái gì đó giống như hackish:
Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");
Đó là Java, mà đòi hỏi sự lookbehind có chiều dài tối đa hiển nhiên. Một số hương vị không có thậm chí là nhiều tính linh hoạt, và dĩ nhiên, một số không hỗ trợ lookbehinds ở tất cả.
Tuy nhiên, vấn đề người lớn dường như có trong các ví dụ của họ không phải là với lookbehinds, nhưng với ranh giới từ. Cả David Kemp và CK dường như mong đợi \b
để phù hợp với nhân vật không gian sau khi 'M', nhưng nó không; nó phù hợp với vị trí (hoặc ranh giới) giữa 'm' và không gian.
Đó là một sai lầm phổ biến, một 1've thậm chí nhìn thấy lần lặp đi lặp lại trong một vài cuốn sách và hướng dẫn, nhưng xây dựng từ biên giới, \b
không bao giờ phù hợp với bất kỳ ký tự. Đó là một sự khẳng định zero-byte, như lookarounds và neo (^
, $
, \z
, vv), và những gì nó phù hợp là một vị trí mà một trong hai là trước bởi một nhân vật từ và không theo sau là một, hoặc theo sau là một nhân vật từ và không đi trước một.
đánh bại tôi quá :) – annakata
Lookbehinds có xu hướng khá hạn chế khi nói đến việc sử dụng ký tự đại diện mặc dù. – cletus
Có thể thậm chí không cần thiết ở đây. Tùy thuộc vào những gì 'tôi muốn phù hợp' trong câu hỏi đề cập đến, xem giải pháp của David Kemp. – user55400