2012-05-08 18 views
6

Tôi có một regex làm việc bằng Python và tôi đang cố chuyển đổi sang Java. Dường như có sự khác biệt tinh tế trong việc triển khai.Sự khác biệt trong cú pháp RegEx giữa Python và Java

RegEx đang cố gắng khớp với một reg cũ khác. Các RegEx trong câu hỏi là:

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B) 

Một trong những chuỗi rằng nó đang có vấn đề trên là: /\s+/;

Các reg cũ không được nghĩa vụ phải được phù hợp với kết thúc ;. Trong Python các RegEx hoạt động chính xác (và không phù hợp với kết thúc ;, nhưng trong Java nó không bao gồm các ;

Các Câu hỏi (s):.

  1. Tôi có thể làm gì để có được RegEx này làm việc trong Java?
  2. Dựa trên những gì tôi đọc here không nên có sự khác biệt đối với RegEx này. có đâu đó một danh sách các sự khác nhau giữa việc triển khai RegEx bằng Python vs Java?
+4

bạn có thể post đoạn code Python và Java cho trận đấu của bạn? Bạn có thể làm rõ những gì bạn có nghĩa là bởi "Điều này xảy ra trong Python nhưng không phải trong Java"? Ngôn ngữ nào phù hợp với chuỗi và ngôn ngữ nào không phải là ngôn ngữ? – happydave

+0

Regex đó có vẻ như nó phải phù hợp với một chữ regex JavaScript, đúng không? Và nó hoạt động trong Python nhưng bạn muốn chạy nó trong Java? –

+0

@happydave - làm rõ câu hỏi trên. – Vineet

Trả lời

10

Java không phân tích cú pháp Cụm từ thông dụng theo cách tương tự như Python cho một nhóm nhỏ các trường hợp. Trong trường hợp cụ thể này, các lỗi [ lồng nhau đã gây ra sự cố. Trong Python, bạn không cần phải thoát khỏi bất kỳ lồng nhau [ nhưng bạn cần phải làm điều đó trong Java.

Các RegEx gốc (đối với Python):

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B) 

Các RegEx cố định (cho Java và Python):

/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/([gim]+\b|\B) 
5

rõ ràng d ifference b/w Java và Python là trong Java, bạn cần phải thoát khỏi rất nhiều ký tự.

Hơn nữa, bạn có lẽ chạy vào một không phù hợp giữa các phương pháp phù hợp, không phải là một sự khác biệt trong các ký hiệu regex thực tế:

Với Java

String regex, input; // initialized to something 
Matcher matcher = Pattern.compile(regex).matcher(input); 
  • Java matcher.matches() (còn Pattern.matches(regex, input)) phù hợp toàn bộ chuỗi. Nó không có tương đương trực tiếp trong Python. Cùng một kết quả có thể đạt được bằng cách sử dụng re.match(regex, input) với một regex kết thúc bằng $.
  • Java matcher.find() và của Python re.search(regex, input) khớp với bất kỳ phần nào của chuỗi.
  • Java matcher.lookingAt() và số re.match(regex, input) của Python khớp với phần đầu của chuỗi.

Để biết thêm chi tiết, hãy đọc tài liệu về Java Matcher và so sánh với Python documentation.

Vì bạn nói đó không phải là vấn đề, tôi quyết định làm bài kiểm tra: http://ideone.com/6w61T Có vẻ như java đang thực hiện chính xác những gì bạn cần (nhóm 0, toàn bộ trận đấu, không chứa ;) . Vấn đề của bạn là ở nơi khác.

+0

Có, các ký tự đang được thoát. Điểm tuyệt vời về sự khác biệt trong các phương pháp - đó dường như không phải là vấn đề ở đây (tôi đã xác minh nó - có vẻ như đã xảy ra sự cố với reg cũ). Tìm hiểu thêm về điều này (http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html) có vẻ như có * là * tương đương với 're.match của Python 'trong Java - nó có vẻ là' matcher.lookingAt'. – Vineet

+0

@Vineet Được chú ý và chỉnh sửa. Tôi cũng đã thử nghiệm nó, và vấn đề của bạn dường như là ở nơi khác. – trutheality

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