2012-12-12 17 views
10

Tôi đang cố gắng phân tích các thẻ TD không tham lam. Tôi bắt đầu với một cái gì đó như thế này:Regex Non-Greedy

<TD>stuff<TD align="right">More stuff<TD align="right>Other stuff<TD>things<TD>more things 

Tôi đang sử dụng dưới đây như là regex của tôi:

Regex.Split(tempS, @"\<TD[.\s]*?\>"); 

Các hồ sơ trở lại như dưới đây:

"" 
"stuff<TD align="right">More stuff<TD align="right>Other stuff" 
"things" 
"more things" 

Tại sao nó không tách kết quả đầy đủ đầu tiên (kết quả bắt đầu bằng "nội dung")? Làm thế nào tôi có thể điều chỉnh regex để phân chia trên tất cả các trường hợp của thẻ TD có hoặc không có tham số?

+0

Xin xem http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+1

'.' chỉ có nghĩa là một dấu chấm đen trong lớp nhân vật '[.]', không phải 'bất kỳ ký tự nào. Bạn _may_ có nhiều thành công hơn với '[^>] *', _but_ nó sẽ phá vỡ một '>' trong một thuộc tính (đó là một trong những lý do tại sao chúng ta thường xem xét các trình phân tích cú pháp thay vì các regexes để thao tác html & xml). – Wrikken

+0

@Wrikken HTML ở đây khá tĩnh. Không có nhiều biến thể và tôi biết regex sẽ làm việc cho nó. Tôi không đi theo con đường phân tích cú pháp vì điều đó. Có cách nào để làm. ký tự có nghĩa là 'bất kỳ ký tự' nào kể cả khoảng trắng? – steventnorris

Trả lời

13

Các regex bạn muốn là <TD[^>]*>:

<  # Match opening tag 
TD # Followed by TD 
[^>]* # Followed by anything not a > (zero or more) 
>  # Closing tag 

Lưu ý: . phù hợp với bất cứ điều gì (kể cả khoảng trắng) để [.\s]*? là không cần thiết và sai như [.] phù hợp với một chữ . nên sử dụng .*?.

+1

Theo mặc định,. không khớp với dòng mới nhưng \ s không khớp. –

+0

Chà, điều này thật xuất sắc ... – Hambone

20

Đối với trận đấu không tham lam, cố gắng này <TD.*?>

+0

Công trình này, nhưng tôi vẫn không thể quấn quanh đầu mình ... – Hambone

+3

@Hambone Vì '?' Sau khi định lượng '*' yêu cầu động cơ Regex ngừng ăn biểu tượng khi tìm thấy kết quả đầu tiên của biểu thức theo sau '?', nghĩa là - '>'. Sự khác biệt là do tham lam và không tham lam '*'. – JustAMartin