นิพจน์ทั่วไป: ค้นหาช่องว่าง (แท็บ / ช่องว่าง) แต่ไม่ใช่ขึ้นบรรทัดใหม่


99

ฉันจะมีนิพจน์ทั่วไปที่ทดสอบช่องว่างหรือแท็บ แต่ไม่ขึ้นบรรทัดใหม่ได้อย่างไร ฉันลองแล้ว\sแต่พบว่ามันทดสอบการขึ้นบรรทัดใหม่ด้วย

ฉันใช้ C # / WPF แต่มันไม่สำคัญ

คำตอบ:


197

ใช้คลาสตัวละคร: [ \t]


1
มองหาปัญหาของฉัน โปรดดูstackoverflow.com/a/25956935/292060สำหรับ\hคลาสอักขระperl เท่านั้นแต่จะแสดงว่ามีช่องว่างอื่น ๆ อีกมากมายในกรณีที่คุณต้องเพิ่มลงในรายการที่นี่
goodeye

3
ทำไมต้องมีที่ว่างก่อน\t?
Ooker

4
@Ooker เพื่อจับพื้นที่ตามตัวอักษร
codemonkee

1
สิ่งนี้จะไม่ตรงกับช่องว่างประเภทอื่นอย่างที่คำตอบอื่น ๆ ได้กล่าวไว้
กัส

1
ทำไมต้องเว้นวรรคก่อน
Catbuilts


14

ดังที่ @ EiríkrÚtlendiกล่าวไว้โซลูชันที่ยอมรับจะพิจารณาเฉพาะอักขระช่องว่างสองตัวเท่านั้น: แท็บแนวนอน (U + 0009) และช่องว่าง (U + 0020) จะไม่พิจารณาอักขระเว้นวรรคอื่น ๆ เช่นช่องว่างที่ไม่ทำลาย (ซึ่งเกิดขึ้นในข้อความที่ฉันพยายามจัดการ) รายชื่อตัวละครของช่องว่างที่สมบูรณ์มากขึ้นจะรวมอยู่ในวิกิพีเดียและอ้างอิงในคำตอบ Perl เชื่อมโยง โซลูชัน C # อย่างง่ายที่อธิบายถึงอักขระอื่น ๆ เหล่านี้สามารถสร้างได้โดยใช้การลบคลาสอักขระ

[\s-[\r\n]]

หรือรวมถึงโซลูชันของEiríkrÚtlendiคุณจะได้รับ

[\s\u3000-[\r\n]]

5

หมายเหตุ:สำหรับผู้ที่จัดการกับข้อความ CJK (จีนญี่ปุ่นและเกาหลี) พื้นที่สองไบต์ (Unicode \u3000) จะไม่รวมอยู่ใน\sการนำไปใช้งานใด ๆ ที่ฉันได้ลองใช้จนถึงตอนนี้ (Perl, .NET, PCRE, Python) คุณจะต้องทำให้สตริงของคุณเป็นปกติก่อน (เช่นโดยการแทนที่ทั้งหมด\u3000ด้วย\u0020) หรือคุณจะต้องใช้ชุดอักขระที่มีจุดรหัสนี้นอกเหนือจากช่องว่างอื่น ๆ ที่คุณกำหนดเป้าหมายเช่น[ \t\u3000]ช่องว่างที่คุณกำหนดเป้าหมายเช่น

หากคุณใช้ Perl หรือ PCRE คุณมีตัวเลือกในการใช้\hชวเลขสำหรับช่องว่างแนวนอนซึ่งดูเหมือนจะรวมช่องว่างแบบไบต์เดียวช่องว่างแบบไบต์คู่และแท็บอื่น ๆ ดูช่องว่างที่ตรงกัน แต่ไม่ขึ้นบรรทัดใหม่ (Perl)หัวข้อขึ้นสำหรับรายละเอียดเพิ่มเติม

อย่างไรก็ตาม\hยังไม่มีการนำชวเลขนี้มาใช้กับ. NET และ C # อย่างที่ดีที่สุดที่ฉันสามารถบอกได้


1
จุดดี. ของ Java \h(แนะนำใน Java 8) จะรวมไว้\u3000ด้วย แต่\sจะไม่รวมอยู่ด้วยเว้นแต่คุณจะตั้งค่าโหมด UNICODE_CHARACTER_CLASS (แนะนำใน Java 7)
Alan Moore

0

หากคุณต้องการแทนที่ช่องว่างด้านล่างรหัสที่ใช้งานได้สำหรับฉันC#

Regex.Replace(Line,"\\\s","");

สำหรับ Tab

Regex.Replace(Line,"\\\s\\\s","");

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.