วิธีตรวจสอบว่าบรรทัดว่างเปล่าโดยใช้ regex


154

ฉันพยายามทำ regex ง่าย ๆ ที่จะตรวจสอบว่าบรรทัดว่างหรือไม่

กรณี;

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

ที่นี่ว่างหมายถึงสิ่งที่คุณหมายถึง บรรทัดประกอบด้วย whitespaces เต็มหรือบรรทัดไม่มีอะไรเลย หากคุณต้องการจับคู่บรรทัดที่ไม่มีอะไรให้ใช้ '/ ^ $ /'
Badri Gs

คำตอบ:


329

รูปแบบที่คุณต้องการมีลักษณะเช่นนี้ในโหมดหลายบรรทัด:

^\s*$

คำอธิบาย:

  • ^ เป็นจุดเริ่มต้นของจุดยึดสตริง
  • $ เป็นจุดสิ้นสุดของจุดยึดสตริง
  • \s เป็นคลาสอักขระช่องว่าง
  • * คือการทำซ้ำของศูนย์หรือมากกว่า

ในโหมดหลายบรรทัด^และ$ยังจับคู่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัด

อ้างอิง:


ทางเลือกที่ไม่ใช่ regex:

นอกจากนี้คุณยังสามารถตรวจสอบว่าสตริงที่กำหนดlineเป็น "ว่าง" (เช่นมี whitespaces เท่านั้น) โดยtrim()-ing มันแล้วตรวจสอบว่าสตริงที่เกิดisEmpty()ขึ้น

ใน Java สิ่งนี้จะเป็นดังนี้:

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

โซลูชัน regex ยังสามารถทำให้ง่ายขึ้นโดยไม่ต้องเบรก (เนื่องจากวิธีที่matchesกำหนดไว้ใน Java) ดังต่อไปนี้:

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

การอ้างอิง API

  • String String.trim()
    • ส่งคืนสำเนาของสตริงโดยเว้นช่องว่างนำหน้าและต่อท้าย
  • boolean String.isEmpty()
    • ผลตอบแทนtrueถ้าหากว่าเป็นlength()0
  • boolean String.matches(String regex)
    • บอกว่าสตริงนี้(ทั้งหมด)ตรงกับนิพจน์ทั่วไปที่กำหนดหรือไม่

1
@Adnan: จดบันทึกความคิดเห็นของ Bart ในคำตอบของ Marcelo; ขึ้นอยู่กับว่าคุณต้องการจัดการกับบรรทัดว่างหลายบรรทัดหรือไม่รูปแบบอาจเปลี่ยนแปลงเล็กน้อย
polygenelubricants

ฉันกำลังอ่านไฟล์จาก Java ทีละบรรทัดดังนั้นฉันคิดว่ามันจะโอเค
Adnan

1
ที่ดูยอดเยี่ยมด้วย line.trim: D
Adnan

1
รหัสที่ยอดเยี่ยมตอนนี้รันจาก 1.6sec ถึง> 1sec ขอบคุณ
Adnan

ในไพ ธ อน: if line.strip(): เนื่องจากสตริงว่างจะประเมินเป็นFalse
John Mark

58

จริง ๆ แล้วในโหมดหลายบรรทัดคำตอบที่ถูกต้องคือ:

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

คำตอบที่ยอมรับ: ^\s*$ไม่ตรงกับสถานการณ์เมื่อบรรทัดสุดท้ายว่างเปล่า (ในโหมดหลายบรรทัด)


ตรงและฉันยืนยันว่าเป็นกรณีนี้ คำตอบที่ยอมรับนั้นหายไปหลายบรรทัดในไฟล์ของฉัน แต่สิ่งนี้จับได้หมด การรวมกันของทั้งสอง regexes จับทุกกรณี
elmor

1
คำตอบนี้ใช้ได้อย่างสมบูรณ์ในเครื่องมืออย่าง Notepad ++ คำตอบที่ยอมรับนั้นตรงกับหลายบรรทัดว่าง แต่ไม่ใช่บรรทัดว่างเดี่ยว
james

ในกรณีของฉันคำตอบที่ยอมรับไม่ทำงานใน Sublime Text 3 และใช้งานได้
yangsibai

1
คำตอบที่ยอมรับใช้งานได้สำหรับกรณีของฉัน multilines สิ่งนี้ทำ
Robert Gabriel

1
นี่ควรเป็นคำตอบที่ดีที่สุด
คำถามที่ฉัน

12

ลองสิ่งนี้:

^\s*$

5
@Adnan โปรดทราบว่า\sยังตรงกับตัวแบ่งบรรทัดดังนั้นคุณจะไม่ "ค้นหา" บรรทัดว่างเปล่าเดียวภายในสตริงที่มีบรรทัดว่างที่ต่อเนื่องกัน
บาร์ต Kiers

6

regex แบบพกพาส่วนใหญ่จะ^[ \t\n]*$ตรงกับสตริงว่าง (โปรดทราบว่าคุณจะต้องแทนที่\tและ\nมีแท็บและขึ้นบรรทัดใหม่ตามลำดับ) และ[^ \n\t]เพื่อจับคู่สตริงที่ไม่ใช่ช่องว่าง


อย่างน้อยฉันก็ต้องเปลี่ยนพื้นที่เดียวกับชั้นเรียน[ \t]
บาร์ต Kiers

1
บน Windows คุณต้องพิจารณาอักขระ\rการขึ้นบรรทัดใหม่เพื่อให้ regex เป็น^[ \t\r\n]*$เช่นนั้น แต่^\s*$จะดีกว่า - กระชับมากขึ้น หากคุณไม่ต้องการจับคู่บรรทัดใหม่คุณสามารถใช้\h(หมายถึงช่องว่างในแนวนอน) เช่นเดียวกับใน^\h*$
ps.pf

5

ให้เครดิตเต็มที่กับbchr02 สำหรับคำตอบนี้ อย่างไรก็ตามฉันต้องปรับเปลี่ยนนิดหน่อยเพื่อจับภาพสถานการณ์สำหรับบรรทัดที่มี*/(สิ้นสุดความคิดเห็น) ตามด้วยบรรทัดว่าง regex */ได้รับการจับคู่สายที่ไม่ว่างเปล่ากับ

ใหม่: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

ทั้งหมดที่ฉันทำคือการเพิ่ม^เป็นอักขระตัวที่สองเพื่อบ่งบอกจุดเริ่มต้นของบรรทัด


ทำไมไม่แสดงความคิดเห็นกับคำตอบของ bchr02 และแนะนำการปรับปรุงคำตอบของเขา?
adamlogan

1
@adamlogan ใช่จากความทรงจำฉันคิดว่าฉันต้องการที่จะทำมันในเวลานั้น แต่ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นในโพสต์ของคนอื่นดังนั้นต้องทำเช่นนี้
John Henry

3

ที่นี่ว่างหมายถึงสิ่งที่คุณหมายถึง
บรรทัดประกอบด้วย whitespaces เต็มหรือบรรทัดไม่มีอะไรเลย
หากคุณต้องการจับคู่บรรทัดที่ไม่มีอะไรให้ใช้ '/ ^ $ /'


-1

ดี ... ฉันแก้ไขมันโดยใช้ notepadd ++) และนี่คือวิธีแก้ปัญหาที่ฉันพบ

\ n \ s

\ n สำหรับจุดสิ้นสุดของบรรทัด (ที่คุณเริ่มจับคู่) - เครื่องหมายรูปหมวกจะไม่ช่วยในกรณีของฉันเนื่องจากจุดเริ่มต้นของแถวเป็นสตริง \ s ใช้พื้นที่ใด ๆ จนถึงสตริงถัดไป

หวังว่ามันจะช่วย


OP ต้องการคำตอบ regex ซึ่งได้รับและไม่เกี่ยวกับอักขระบรรทัดใหม่
Moody_Mudskipper

ผู้ใช้ถามหา "regex ง่าย ๆ ที่จะตรวจสอบว่าบรรทัดว่างเปล่าหรือไม่" regex นี้ (ทดสอบใน regexpal.com) ทำเช่นนั้นทุกประการ ทำไมคุณไม่ทดสอบมัน
M_TRONIC

โดยใช้ R, test_vec <- c(" some"," ","")เวกเตอร์การทดสอบของเรา: วิธีการแก้ปัญหาของคุณ: การแก้ปัญหาการโหวต:grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUEโซลูชันที่โหวตให้ผลลัพธ์ที่คาดหวังไม่ใช่ของคุณ
Moody_Mudskipper

เหมือนที่ฉันบอกว่าฉันใช้สิ่งนี้ใน notepad ++ และมันใช้งานได้ คุณไม่ได้ ดังนั้นฉันเดาว่าเราสามารถเห็นด้วยที่จะไม่เห็นด้วย!
M_TRONIC

ฉันไม่แน่ใจจริงๆว่าคุณกำลังทำอะไรอยู่คุณทำอะไรctrl+fใน notepad ++? ในกรณีนี้คุณสามารถค้นหา (แม้ว่าจะไม่ตรงกันจริงๆ) บรรทัดว่างโดยเลือกโหมดการค้นหาแบบ "ขยาย" และค้นหา '\ n \ s' หากคุณเลือก "การแสดงออกปกติ" สตริงของคุณจะตรงกันและคุณสามารถ ลองใช้วิธีแก้ปัญหาของ @polygenelubricants หลังนี้จะตรงกับบรรทัดคุณสามารถตรวจสอบและดูความแตกต่างได้ฉันขอแนะนำให้คุณแก้ไขคำตอบของคุณให้ชัดเจนยิ่งขึ้นเกี่ยวกับสิ่งที่คุณกำลังให้คำแนะนำ มัน
Moody_Mudskipper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.