2012-10-22 33 views
12

Tôi có một chuỗi ví dụ:Regex để đối sánh nhận xét đa dòng kiểu C

String src = "How are things today /* this is comment *\*/ and is your code /*\* this is another comment */ working?" 

Tôi muốn loại bỏ /* this is comment *\*//** this is another comment */ chuỗi con từ src chuỗi.

Tôi đã cố gắng sử dụng regex nhưng không thành công do ít kinh nghiệm hơn.

+6

đang Parsing Java với regex không phải là điều tôi muốn khuyên. – Confluence

+0

@Confluence, tôi không chắc chắn những gì có thể là lựa chọn tốt nhất để đạt được kết quả? Bạn có thể đề nghị một. – hanumant

+0

Bạn đã thử regex nào? Như bạn đã nói rằng bạn đã thử một cái gì đó, bạn cũng có thể chỉ cần dán nó ở đây, vì vậy chúng ta có thể thấy cách tiếp cận của bạn. Chúng tôi có thể đi vào chi tiết hơn/ít hơn về các giải pháp tùy thuộc vào trải nghiệm của bạn. – brimborium

Trả lời

11

Hãy thử sử dụng regex này (Single dòng chỉ comments):

String src ="How are things today /* this is comment */ and is your code /* this is another comment */ working?"; 
String result=src.replaceAll("/\\*.*?\\*/","");//single line comments 
System.out.println(result); 

REGEX giải thích:

Phù hợp với nhân vật "/" theo nghĩa đen

Phù hợp với nhân vật "*" theo nghĩa đen

"." Khớp bất kỳ ký tự nào đơn lẻ

"*?" Giữa zero và thời gian không giới hạn, như vài lần càng tốt, mở rộng khi cần thiết (lười biếng)

Phù hợp với nhân vật "*" theo nghĩa đen

Phù hợp với nhân vật "/" theo nghĩa đen

Ngoài ra ở đây là regex cho duy nhất và nhiều dòng bình luận bằng cách thêm (s?):

//note the added \n which wont work with previous regex 
String src ="How are things today /* this\n is comment */ and is your code /* this is another comment */ working?"; 
String result=src.replaceAll("(?s)/\\*.*?\\*/",""); 
System.out.println(result); 

tham khảo:

+5

Sẽ thật thú vị khi bạn có chuỗi chứa chuỗi chú thích. – nhahtdh

+0

Bạn có thể giải thích cách hoạt động của regex đa cấp không? Tôi không hiểu * (? S) * (và liên kết không giúp ích gì về vấn đề đó). – brimborium

+0

@nhahtdh +1 Lol có một câu chuyện khác hoàn toàn (tôi đoán bạn chỉ cần kiểm tra Chuỗi trước cho bất kỳ chuỗi ký tự xung đột nào và thay thế chúng bằng cái gì đó an toàn cho đến khi regex hoàn thành rồi thay thế chúng trở lại? –

0
System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", "")); 

Bạn phải sử dụng các phi tham lam-lượng hóa? để có được regex làm việc. Tôi cũng đã thêm '?' ở cuối regex để xóa một không gian.

12

Các multiline tốt nhất bình luận regex là một phiên bản unrolled của (?s)/\*.*?\*/ trông giống như

String pat = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/"; 

Xem /\*[^*]*\*+(?:[^/*][^*]*\*+)*/ regex demo và giải thích tại regex101.com.

Nói tóm lại,

  • /\* - phù hợp với những nhận xét bắt đầu /*
  • [^*]*\*+ - trận đấu 0+ nhân vật khác hơn * theo sau với 1+ đen *
  • (?:[^/*][^*]*\*+)* - 0+ chuỗi:
    • [^/*][^*]*\*+ - không phải là / hoặc * (phù hợp với [^/*]) tiếp với 0+ ký tự không dấu ([^*]*) tiếp với 1+ dấu hoa thị (\*+)
  • / - đóng /

David's regex nhu cầu 26 bước để tìm ra khớp trong chuỗi mẫu của tôi và my regex chỉ cần 12 bước. Với đầu vào khổng lồ, regex của David có thể thất bại với vấn đề tràn bộ đệm hoặc thứ gì đó tương tự vì kết hợp dấu chấm lười .*? không hiệu quả do mở rộng mô hình lười tại mỗi vị trí mà công cụ regex thực hiện, trong khi mẫu của tôi khớp với khối văn bản một lần .

+0

Bạn đã nghĩ ra điều này bằng cách nào? –

+1

@ AT-Aoi Về cơ bản, nó được lấy từ * Làm chủ các biểu thức chính quy *, * Xóa phần C Comments *. –

0

Hãy thử điều này mà làm việc cho tôi:

System.out.println(src.replaceAll("(\/\*.*?\*\/)+","")); 
Các vấn đề liên quan