2010-10-06 37 views

Trả lời

2

Java không chỉ cho phép giao diện không bị ràng buộc, nó có nghĩa vụ phải ném một ngoại lệ nếu bạn cố gắng. Thực tế là bạn không thấy ngoại lệ đó là itself a bug.

Bạn không nên sử dụng ngoại hình cho điều đó. Nếu bạn muốn khớp với giá trị của một thuộc tính nhất định, cách tiếp cận dễ nhất, ít phiền toái nhất là khớp toàn bộ thuộc tính và sử dụng nhóm chụp để trích xuất giá trị. Ví dụ:

String source = "<input id = \"g\" />"; 
Pattern p = Pattern.compile("\\bid\\s*=\\s*\"([^\"]*)\""); 
Matcher m = p.matcher(source); 
if (m.find()) 
{ 
    System.out.printf("Found 'id' attribute '%s' at position %d%n", 
        m.group(1), m.start()); 
} 

Output:

Found 'id' attribute 'g' at position 7 

Làm cho mình một đặc ân và quên đi lookbehinds một thời gian. Họ đang khó khăn ngay cả khi họ không lỗi, và họ thực sự không hữu ích như bạn mong đợi.

6

java.util.regex không hỗ trợ vô hạn nhìn phía sau, như được mô tả trong bằng RegexBuddy:

Tin xấu là hầu hết regex hương vị không cho phép bạn sử dụng chỉ bất kỳ regex bên trong một nhìn chung, bởi vì , chúng không thể áp dụng cụm từ thông dụng ngược. Do đó, công cụ biểu thức thông thường cần phải có khả năng tìm ra số bước để quay lại trước khi kiểm tra giao diện.

Để thêm một chút làm rõ từ các tài liệu:

Vì vậy, nhiều hương vị regex, kể cả những người sử dụng bởi Perl và Python , chỉ cho phép chiều dài cố định chuỗi. Bạn có thể sử dụng bất kỳ regex nào của mà độ dài của trận đấu có thể là được xác định trước. Điều này có nghĩa là bạn có thể sử dụng văn bản và các lớp ký tự theo nghĩa đen. Bạn không thể sử dụng lặp lại hoặc tùy chọn mục. Bạn chỉ có thể sử dụng luân phiên, nhưng chỉ nếu tất cả các tùy chọn trong luân phiên có cùng độ dài.

Một số hương vị regex, như PCRE và Java hỗ trợ ở trên, cộng với thay đổi với các chuỗi có độ dài khác nhau. Mỗi phần của sự thay đổi phải vẫn có độ dài tối đa hữu hạn. Điều này có nghĩa là bạn vẫn không thể sử dụng dấu sao hoặc dấu cộng, nhưng bạn có thể sử dụng dấu hỏi và dấu ngoặc nhọn với tham số tối đa được chỉ định. Những hương vị regex này nhận ra thực tế rằng sự lặp lại hữu hạn có thể được viết lại dưới dạng một chuỗi luân phiên với độ dài khác nhau, nhưng cố định. Thật không may, JDK 1.4 và 1.5 có một số lỗi khi bạn sử dụng thay đổi bên trong lookbehind. Những đã được sửa trong JDK 1.6.

+0

Văn bản đó là từ một phiên bản cũ hơn của hướng dẫn, và nó được viết rất kém. Phiên bản cập nhật tại trang web của anh ấy rõ ràng hơn nhiều: http://www.regular-expressions.info/lookaround.html PCRE chấp nhận các lựa chọn thay thế trong đó mọi thay thế có độ dài cố định nhưng không nhất thiết phải có tất cả độ dài * cùng *. Mọi thứ khác trong đoạn đó chỉ áp dụng cho Java. –

0

java.util.regex không hỗ trợ lặp lại vô hạn bên trong lookbehind

2

Vì vậy, một vài người đã giải thích lý do tại sao regexp của bạn không hoạt động (và đó là gây tử vong thực sự; Java biểu thức thông thường không thể làm gì bạn cần). Tuy nhiên, bạn có thể tự hỏi làm cách nào để phân tích cú pháp này ...

Dường như chuỗi bạn đang cố gắng phân tích là XML. Regex thực sự không phải là một cách tiếp cận tốt để phân tích cú pháp XML; có một sự không phù hợp giữa những gì có thể được mã hóa trong XML và những gì có thể được kết hợp bằng cách sử dụng các biểu thức thông thường. Vì vậy, nếu đây là một phần của một số văn bản XML, có thể xem xét slurping nó vào một phân tích cú pháp XML mà bạn có thể truy vấn cho các yếu tố khác nhau.

Để có một cuộc thảo luận bình tĩnh và hợp lý về vấn đề này, hãy xem bài đăng ngăn xếp cổ điển này: RegEx match open tags except XHTML self-contained tags.

Hy vọng điều này sẽ hữu ích!

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