2013-01-22 28 views
9

Tôi cần tìm các dòng có chứa nhiều hơn 10 "," (tôi đã gặp lỗi khi nhập CSV, vì vậy tôi cần sửa nó theo cách thủ công). Tôi đang sử dụng Notepad ++ vì vậy tôi không cần phải viết reqex cho phù hợp với dòng, chỉ để phù hợp với hôn mê.Cụm từ thông dụng để khớp với văn bản chứa n hoặc nhiều ký tự được chỉ định

(.*,.*){11,100} //does not work 
+0

Bạn có thể làm rõ ý của mình bằng cách "không hoạt động" không? Regex của bạn nên tìm các dòng với hơn 10 dấu phẩy, ngay cả khi nó đi về kinh doanh của nó một cách rất phức tạp. –

Trả lời

12

.* cũng khớp với dấu phẩy. Bạn cần phải loại trừ những người có một lớp nhân vật phủ nhận ([^,] trận đấu bất kỳ ký tự trừ dấu phẩy):

^[^,\r\n]*(?:,[^,\r\n]*){11,}$ 

Tôi đã thêm \r\n đến lớp nhân vật hoặc nó sẽ phù hợp trên dòng mới. Tuy nhiên, hãy lưu ý rằng điều này cũng sẽ tính các dấu phẩy được chứa trong các chuỗi được trích dẫn, vì vậy nếu bạn có các chuỗi đó, bạn sẽ đánh giá sai số lượng trường trong hàng CSV của mình.

2

Giả sử Notepad ++ phiên bản 6+ (sử dụng thư viện Biểu thức chính quy tương thích Perl PCRE) và '. phù hợp với newline 'hộp không được chọn trong cửa sổ Find:

(.*?,){11,}

Nếu một dòng chứa hơn 10 dấu phẩy, điều này sẽ phù hợp với từ đầu dòng để dấu phẩy cuối cùng.

(.*?,) khớp với bất kỳ ký tự nào ngoài dòng mới càng ít lần càng tốt cho đến khi ký tự tiếp theo là dấu phẩy; {11,} có nghĩa là từ 11 lần trở lên.

Nếu bạn muốn regex hoạt động bất kể '. phù hợp với newline 'hộp được đánh dấu, bạn có thể sử dụng:

([^\n]*?,){11,} 

regex của bạn không hoạt động nếu' . khớp với dòng mới 'không được chọn, nhưng vì nó khớp với bất kỳ ký tự nào tham lam, có thể có một số lượng lớn các kết quả tiềm năng mà nó có thể xuất hiện treo ứng dụng. Thêm ? sau .* để ký tự đại diện khớp với lazily hoặc miễn cưỡng, tức là ít nhất có thể, sẽ giải quyết được sự cố.

PCRE man pages
Perl Regular Expressions documentation - được khuyến nghị.
Notepad++ "outdated" regular expressions tutorial

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