Cách kiểm tra nếu một dòng trống bằng regex


154

Tôi đang cố gắng thực hiện regex đơn giản để kiểm tra xem một dòng có trống hay không.

Trường hợp;

"    some"   // not blank
"   " //blank
"" // blank

Ở đây Trống có nghĩa là những gì bạn có nghĩa. Một dòng chứa đầy khoảng trắng hoặc một dòng không chứa gì. Nếu bạn muốn khớp một dòng không chứa gì thì hãy sử dụng '/ ^ $ /'
Badri Gs

Câu trả lời:


329

Mẫu bạn muốn là một cái gì đó như thế này trong chế độ đa dòng:

^\s*$

Giải trình:

  • ^ là sự khởi đầu của chuỗi neo.
  • $ là kết thúc của chuỗi neo.
  • \s là lớp ký tự khoảng trắng.
  • * là không lặp lại hoặc nhiều hơn.

Trong chế độ đa dòng, ^$cũng khớp với đầu và cuối của dòng.

Người giới thiệu:


Một thay thế không regex:

Bạn cũng có thể kiểm tra xem một chuỗi đã cho linecó "trống" không (nghĩa là chỉ chứa các khoảng trắng) bằng cách trim()-ing nó, sau đó kiểm tra xem chuỗi kết quả isEmpty().

Trong Java, đây sẽ là một cái gì đó như thế này:

if (line.trim().isEmpty()) {
    // line is "blank"
}

Giải pháp regex cũng có thể được đơn giản hóa mà không cần neo (vì cách matchesđịnh nghĩa trong Java) như sau:

if (line.matches("\\s*")) {
    // line is "blank"
}

Tài liệu tham khảo API


1
@Adnan: ghi lại nhận xét của Bart trong câu trả lời của Marcelo; tùy thuộc vào cách bạn muốn xử lý nhiều dòng trống, mẫu có thể thay đổi một chút.
đa gen

Vâng, tôi đang đọc một tệp từ Java, từng dòng một, vì vậy tôi cho rằng điều này sẽ ổn.
Adnan

1
điều đó có vẻ tuyệt vời với line.trim: D
Adnan

1
xuất sắc các mã hiện thực thi từ 1.6 giây đến> 1 giây Cảm ơn bạn.
Ad Nam

trong python: if line.strip(): vì một chuỗi rỗng ước tínhFalse
John Mark

58

Trên thực tế ở chế độ đa dòng, một câu trả lời đúng hơn là:

/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Câu trả lời được chấp nhận: ^\s*$không khớp với kịch bản khi dòng cuối cùng trống (ở chế độ đa dòng).


Chính xác, và tôi xác nhận đây là trường hợp. Câu trả lời được chấp nhận đã bỏ lỡ nhiều dòng trống trong tệp của tôi, nhưng điều này đã bắt được tất cả. Sự kết hợp của cả hai regexes bắt mọi trường hợp.
elmor

1
Câu trả lời này hoạt động hoàn hảo trong một công cụ như Notepad ++. Câu trả lời được chấp nhận khớp với nhiều dòng trống nhưng không phải là dòng trống đơn.
James

Trong trường hợp của tôi, câu trả lời được chấp nhận không hoạt động trong Sublime Text 3, và điều này hoạt động.
yangsibai

1
Câu trả lời được chấp nhận đã làm việc cho trường hợp của tôi, multilines. Điều này không.
Robert Gabriel

1
đây sẽ là câu trả lời tốt nhất
Q i

12

Thử cái này:

^\s*$

5
@Adnan, lưu ý rằng \scũng khớp với ngắt dòng, vì vậy bạn sẽ không "tìm thấy" các dòng trống đơn bên trong một chuỗi chứa các dòng trống liên tiếp.
Bart Kiers

6

Regex di động nhất sẽ ^[ \t\n]*$phù hợp với một chuỗi trống (lưu ý rằng bạn sẽ cần phải thay thế \t\nvới tab và dòng mới phù hợp) và [^ \n\t]để phù hợp với một chuỗi không có khoảng trắng.


Ít nhất tôi sẽ thay đổi không gian duy nhất với lớp học[ \t]
Bart Kiers

1
Trên Windows, bạn cũng cần xem xét ký tự trả về vận chuyển \rđể biểu thức chính quy ^[ \t\r\n]*$. Nhưng ^\s*$là tốt hơn - súc tích hơn. Nếu bạn không muốn khớp dòng mới, bạn có thể sử dụng \h(có nghĩa là khoảng trắng ngang) như trong^\h*$
ps.pf

5

Tín dụng đầy đủ cho bchr02 cho câu trả lời này . Tuy nhiên, tôi đã phải sửa đổi nó một chút để bắt được kịch bản cho các dòng có */(cuối bình luận) theo sau là một dòng trống. Regex phù hợp với dòng không trống với */.

Mới: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Tất cả những gì tôi đã làm là thêm ^ký tự thứ hai để biểu thị điểm bắt đầu của dòng.


Tại sao không bình luận về câu trả lời của bchr02 và đề nghị cải thiện câu trả lời của anh ấy?
adamlogan

1
@adamlogan yeah, từ bộ nhớ, tôi nghĩ rằng tôi muốn làm điều đó vào thời điểm đó, nhưng tôi không có đủ danh tiếng để bình luận về bài đăng của người khác, vì vậy phải làm điều đó như thế này.
John Henry

3

Ở đây Trống có nghĩa là những gì bạn có nghĩa.
Một dòng chứa đầy khoảng trắng hoặc một dòng không chứa gì.
Nếu bạn muốn khớp một dòng không chứa gì thì hãy sử dụng '/ ^ $ /'.


-1

Chà ... tôi đã sửa lại (sử dụng notepadd ++) và đây là giải pháp tôi tìm thấy

\ n \ s

\ n cho cuối dòng (nơi bạn bắt đầu khớp) - dấu mũ sẽ không giúp ích gì trong trường hợp của tôi vì đầu hàng là một chuỗi \ s chiếm bất kỳ khoảng trống nào cho đến chuỗi tiếp theo

hy vọng nó giúp


OP muốn có một câu trả lời regex, được đưa ra, và không phải là về các ký tự dòng mới.
Moody_Mudskipper

người dùng yêu cầu "regex đơn giản sẽ kiểm tra xem một dòng có trống không" regex này (đã được thử nghiệm trong regrecal.com) thực hiện chính xác điều đó. Tại sao bạn không kiểm tra nó?
M_TRONIC

sử dụng R, vector thử nghiệm của chúng tôi : test_vec <- c(" some"," ",""). giải pháp của bạn : grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE, giải pháp đã bỏ phiếu : grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. giải pháp bỏ phiếu cho kết quả mong đợi, của bạn thì không.
Moody_Mudskipper

như tôi đã nói tôi đã sử dụng cái này trên notepad ++ và nó đã hoạt động. của bạn đã không. vì vậy tôi đoán chúng ta có thể đồng ý không đồng ý!
M_TRONIC

Tôi thực sự không chắc chắn những gì bạn đang làm, bạn đang làm ctrl+ftrong notepad ++? Trong trường hợp này, bạn có thể tìm thấy (mặc dù không thực sự khớp) các dòng trống bằng cách chọn chế độ Tìm kiếm "Mở rộng" và tìm kiếm '\ n \ s', nếu bạn chọn "Biểu thức chính quy ', chuỗi của bạn sẽ khớp như nhau và bạn có thể cũng thử giải pháp của @polygenelubricants. Cái sau sẽ thực sự khớp với dòng, bạn có thể kiểm tra và xem sự khác biệt. Tôi khuyên bạn nên chỉnh sửa câu trả lời của mình để rõ hơn về những gì bạn đang tư vấn, để người đọc có thể nhận được nhiều giá trị hơn từ nó.
Moody_Mudskipper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.