2010-03-23 22 views
330

regex My mô hình trông giống nhưbiểu hiện thường xuyên dừng lại ở trận đấu đầu tiên

<xxxx location="file path/level1/level2" xxxx some="xxx"> 

Tôi chỉ quan tâm đến một phần trong dấu ngoặc kép giao cho địa điểm. Không nên dễ dàng như dưới đây mà không có sự chuyển đổi tham lam?

/.*location="(.*)".*/ 

Có vẻ như không hoạt động.

+0

Nguồn của bạn là gì, HTML hay xml hay gì đó? –

+14

Tại sao đây là một wiki cộng đồng? Đó là một câu hỏi thực sự. Quá muộn rồi. –

+0

@Kurresmack Đó là XML. – publicRavi

Trả lời

686

Bạn cần phải làm cho cụm từ thông dụng của bạn không tham lam, bởi theo mặc định, "(.*)" sẽ khớp với tất cả "file path/level1/level2" xxx some="xxx".

Thay vào đó bạn có thể làm cho dot-sao bạn không tham lam, mà sẽ làm cho nó phù hợp như vài nhân vật càng tốt:

/location="(.*?)"/ 

Thêm một ? trên một lượng hóa (?, * hoặc +) làm cho nó không -tham.

+25

FWIW, trong trường hợp sử dụng VIM của bạn, regex này cần phải có một chút khác biệt: thay vì '. *?' Nó '. \ {-}' cho một trận đấu không tham lam. – SooDesuNe

+24

Cảm ơn Daniel. ** "Thêm một? Trên một định lượng (?, * Hoặc +) làm cho nó không tham lam." ** là mẹo hữu ích cho tôi. – PhatHV

+5

? mô tả sự nhầm lẫn của tôi trong việc cố gắng tìm ra điều này. Làm thế nào thích hợp. –

11

Sử dụng kết hợp không tham lam, nếu động cơ của bạn hỗ trợ. Thêm? bên trong chụp.

/location="(.*?)"/ 
36

location="(.*)" sẽ phù hợp với từ "sau khi location= cho đến khi" sau some="xxx trừ khi bạn thực hiện nó không phải là tham lam. Vì vậy, bạn cần .*? (ví dụ: làm cho nó không tham lam) hoặc thay thế tốt hơn .* bằng [^"]*.

+5

+1, '[^"] * "' rõ ràng hơn '. *?" 'Bất kỳ ngày nào – Kip

+3

[^"] * cũng có thể nhanh hơn với hầu hết các động cơ regex vì nó không cần tra cứu mẫu sau mẫu hiện tại . –

+1

@Kip: Có thể bạn đã đúng, nhưng ký hiệu '. *?' Là tổng quát hơn '[^"] * ' – Bondax

20

Làm thế nào về

.*location="([^"]*)".* 

Điều này tránh sự tìm kiếm không giới hạn với. * Và sẽ phù hợp chính xác để báo giá đầu tiên.

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