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
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
Câu trả lời:
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, ^
và $
cũng khớp với đầu và cuối của dòng.
Bạn cũng có thể kiểm tra xem một chuỗi đã cho line
có "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"
}
String String.trim()
boolean String.isEmpty()
true
nếu và chỉ khi, length()
là 0
.boolean String.matches(String regex)
if line.strip():
vì một chuỗi rỗng ước tínhFalse
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).
Thử cái này:
^\s*$
\s
cũ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.
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
và \n
vớ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]
\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*$
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.
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
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.
ctrl+f
trong 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ó.