2010-07-19 12 views
6

Sử dụng lợn apache và văn bảnbiểu thức chính quy tương ứng trong lợn

hahahah. my brother just didnt do anything wrong. He cheated on a test? no way! 

Tôi đang cố gắng để phù hợp với "người anh em của tôi chỉ didnt làm bất cứ điều gì sai trái."

Lý tưởng nhất, tôi muốn kết hợp mọi thứ bắt đầu bằng "anh tôi chỉ" và kết thúc bằng dấu chấm câu (kết thúc câu) hoặc EOL.

Nhìn vào các tài liệu lợn, rồi làm theo các liên kết đến java.util.regex.Pattern, tôi con tôi sẽ có thể sử dụng

extrctd = FOREACH fltr GENERATE FLATTEN(EXTRACT(txt,'(my brother just .*\\p{Punct})')) as (txt:chararray); 

Nhưng điều đó dường như để phù hợp cho đến cuối dòng . Bất kỳ đề xuất nào để thực hiện trận đấu này? Tôi sẵn sàng để kéo tóc của tôi ra, và bởi kéo tóc của tôi ra, tôi có nghĩa là chuyển sang python luồng

Trả lời

4

Theo số lượng mặc định là greedy. Điều này có nghĩa là chúng khớp với nhau nhiều nhất có thể. Trong trường hợp này, bạn chỉ muốn khớp với dấu câu đầu tiên. Nói cách khác, bạn muốn kết hợp càng ít càng tốt.

Vì vậy, để giải quyết vấn đề của bạn, bạn nên làm cho quanitifer không tham lam bằng cách thêm một ? ngay sau nó:

 
my brother just .*?\\p{Punct} 
       ^

Lưu ý rằng việc sử dụng ? ở đây là khác biệt so với việc sử dụng nó như một lượng hóa nơi nó có nghĩa là ' khớp với số không hoặc một '.

+0

Bạn có thể giải thích phần tham lam không? Tôi nghĩ rằng tôi sẽ chỉ được kết hợp từ từ chỉ, bất kỳ văn bản sau đây, lên đến trường hợp đầu tiên của dấu chấm câu. –

+0

Nếu không tham lam, nó không khớp với ví dụ đầu tiên của dấu chấm câu, thay vì nó khớp với dấu câu _last_. – Wrikken

+0

@Neil Kodner: Tôi đã cập nhật câu trả lời. –

0

Các bạn đã thử: .*(my brother just .*\\p{Punct})

Dường như biểu hiện của bạn muốn phần my brother là sự khởi đầu của chuỗi, nhưng trong ví dụ của bạn, nó nằm ở giữa chuỗi, do đó bạn phải tính toán mọi thứ trước my brother.