2010-09-13 42 views
10

Tôi cần một regex mà trích xuất văn bản bên trong một delimiter nhưng tôi có cố khi trích xuất các giá trị bên trong dấu phân cách [DỮ LIỆU n] và [END DỮ LIỆU]văn bản phù hợp với RegEx ở giữa delimiters

Dưới đây là regex tôi

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\]) 

Dưới đây là ví dụ dữ liệu tôi muốn để phù hợp với

Một số văn bản ở đây

[DATA 1] 
data one 
some more data 
[END DATA] 
[DATA 2] 
data two 
more data 
data 
[END DATA] 
[DATA n] 
more data 
data 
[END DATA] 

Trả lời

20

Có vẻ như bạn đang sử dụng các tính năng biểu thức chính quy như lookbehind và lookahead khi bạn thực sự không cần chúng. Hãy thử:

\[DATA\s+\d+\](.*?)\[END DATA\] 

Chỉ có một nhóm chụp trong biểu thức chính quy này, (.*?). Sau khi sử dụng này, các kết quả mà bạn đang tìm kiếm phải ở trong nhóm chụp 1.

Cũng lưu ý rằng tôi đã sử dụng các phi tham lam .*? trận đấu đó sẽ phù hợp cho đến khi đầu tiên dụ sau đây [END DATA]. Nếu không có điều này, nếu bạn chỉ sử dụng .*, bạn sẽ chụp mọi thứ tối đa lần cuối[END DATA].

5

Trong regex, [ văn bản giữa ] được gọi là lớp nhân vật và các công cụ regex sẽ chỉ khớp với các số một của các ký tự giữa các dấu ngoặc. Bạn chỉ cần đặt dấu gạch chéo ngược để làm cho chúng theo nghĩa đen:

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\]) 
+0

xin lỗi tôi đã chỉnh sửa bài đăng của mình, nó phải chứa \ cho dấu ngoặc vuông. cảm ơn. nhưng nó vẫn không trích xuất dữ liệu bên trong dấu phân cách btw tôi đang sử dụng expresso – dynamicvoid

+0

Điều này làm việc tuyệt vời cho tôi (? <= \ [). * (? = \]) cho văn bản như: [TEXT] – tkrn

+0

Giải pháp này doesn ' t dường như làm việc. –

1

Sử dụng \ để thoát khỏi ký tự.

\[DATA\s\d\]+([^\[]+)\[[^\]]+\] 
4

Dấu chấm đặc biệt không khớp với dòng mới theo mặc định. Hãy chắc chắn rằng bạn đang sử dụng single-line modifier để thực hiện lại regex, hoặc sử dụng [\S\s]*? thay vì .*?

Xem http://www.regular-expressions.info/modifiers.htmlhttp://www.regular-expressions.info/dot.html để biết chi tiết.

+0

Tốt hơn để xác định nội dòng sửa đổi một dòng bằng cách sử dụng '(? S)' ở phía trước. –

+0

Vâng, đó chắc chắn là một lựa chọn. Tôi không nghĩ rằng đó là hỗ trợ bởi tất cả các triển khai regex mặc dù. Theo như tôi biết, Javascript không hỗ trợ cú pháp đó. Câu hỏi không cụ thể, vì vậy tôi chỉ đề xuất điều gì đó sẽ hoạt động tốt nhất (nếu không phải tất cả) trường hợp. –

+0

Tôi muốn trích xuất tất cả dữ liệu bên trong dấu phân cách và nó phải là đa dòng, vâng tôi đồng ý. *? không áp dụng. – dynamicvoid

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