วิธีค้นหาการเว้นวรรคมากกว่าหนึ่งช่องระหว่างคำในบรรทัด


110

วิธีค้นหาการเว้นวรรคมากกว่าหนึ่งช่องระหว่างคำในบรรทัด

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

ทั้งหมดข้างต้นเป็นการจับคู่ที่ถูกต้องสำหรับ regex นี้ ฉันควรใช้ regex อะไร


คุณกำลังพยายามตรวจสอบช่องว่างติดต่อกันหรือช่องว่างทั้งหมดในบรรทัดนั้นหรือไม่?
Sachin Shanbhag

ช่องว่างติดต่อกันไม่ใช่ช่องว่างทั้งหมด
แซม

1
"ระหว่างคำ" หมายความว่าอย่างไร ในสองตัวอย่างของคุณมีช่องว่างหลายช่องระหว่างคำและตัวเลข เครื่องหมายวรรคตอนเป็นอย่างไร (เช่นคุณต้องการจับคู่ช่องว่างหลายช่องหลังจุดและก่อนคำถัดไป) ช่องว่างก่อน / หลังอักขระสุดท้ายในบรรทัดล่ะ? คุณต้องการจับคู่แท็บด้วยหรือไม่? แล้วเส้นที่ไม่มีช่องว่างล่ะ?
Tim Pietzcker

ช่องว่างระหว่าง "ที่มีและ 2", "ที่มีและ 3", "แรกและที่สอง", "ที่สองและสาม" ... ใช่ฉันต้องการจับคู่ช่องว่างหลังจุดและก่อนคำถัดไป
แซม

คำตอบ:


181
[ ]{2,}

SPACE (2 หรือมากกว่า)

คุณยังตรวจสอบได้ด้วยว่าก่อนและหลังคำเว้นวรรคเหล่านั้นตามหลัง (ไม่ใช่ช่องว่างอื่น ๆ เช่นแท็บหรือบรรทัดใหม่)

\w[ ]{2,}\w

เหมือนกัน แต่คุณยังสามารถเลือก (จับภาพ) เฉพาะช่องว่างสำหรับงานเช่นการแทนที่

\w([ ]{2,})\w

หรือดูว่าก่อนและหลังเว้นวรรคมีอะไรไม่ใช่เฉพาะอักขระคำ (ยกเว้นช่องว่าง)

[^\s]([ ]{2,})[^\s]

1
\wหมายถึง 'อักขระคำ' นั่นคือตัวเลขและตัวอักษรและขีดล่าง แต่ไม่ใช่อักขระอื่น ๆ ที่ไม่ใช่ช่องว่าง หากต้องการตรวจสอบช่องว่างให้ใช้\S(ตัวพิมพ์ใหญ่ S) นอกจากนี้บรรทัดแรกจะจับคู่บรรทัดที่มีช่องว่างตั้งแต่สองช่องขึ้นไปเท่านั้นและไม่มีอะไรอื่น
tdammers

ฉันพยายามที่จะพัฒนาคำถาม ฉันเข้าใจว่าฉันพลาดสิ่งที่คุณพูดไป\Sฉันแค่ไม่ต้องการพึ่งพาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่สำหรับฟังก์ชันดังกล่าวอ่านง่ายกว่า
AlexanderMP

1
ทำไมคุณถึงใช้พุกเลย? เขากำลังมองหาช่องว่างที่ฝังอยู่ในเส้น
Tim Pietzcker

ไม่มีเหตุผลพิเศษ ตอนแรกฉันคิดว่าฉันต้องการพวกเขาดังนั้นฉันจึงลากพวกเขาไปตลอดกระบวนการ อันที่จริงคุณคิดถูกแล้วที่ฉันผิดที่ใช้พวกเขาในกรณีนี้ ฉันจะแก้ไขคำตอบทันที
AlexanderMP

1
\w[ ]{2,}\wจะไม่สามารถจับคู่word.<2 spaces>more wordsหรือสตริงที่ประกอบด้วยช่องว่างทั้งหมด [^\s]([ ]{2,})[^\s]\wจะล้มเหลวในบรรทัดที่ขึ้นต้นด้วยช่องว่างหรือสตริงเช่นbla<2 spaces>....
Tim Pietzcker

12

วิธีง่ายๆ:

/\s{2,}/

สิ่งนี้จะจับคู่อักขระเว้นวรรคทั้งหมดที่เกิดขึ้น หากคุณต้องการจับคู่ทั้งบรรทัด แต่หากมีช่องว่างสองอักขระขึ้นไปติดต่อกัน:

/^.*\s{2,}.*$/

หากช่องว่างไม่จำเป็นต้องติดต่อกัน:

/^(.*\s.*){2,}$/

.*มักจะโลภหมายความว่ามันจะถึงจุดสิ้นสุดของสตริงทดสอบและทั้งหมดซึ่งต่อไปนี้ถ้ามีตัวอักษรบังคับจะไม่ตรงกับ โดยปกติในกรณีนี้มันเป็นวิธีที่ดีในการเพิ่มเช่นนี้? .*?เกิดขึ้นกับฉันโดยใช้ PCRE ของ PHP
AlexanderMP

มันไม่ตรงกัน "โลภ" หมายถึงการจับคู่ให้มากที่สุดในขณะที่ยังคงจับคู่รูปแบบโดยรวม /^.*b.*$/ในความเป็นจริงไม่ตรงกัน"foobar"แม้ว่าคุณจะคาดหวังให้โลภแรก.*ตรงกับสตริงทั้งหมดอยู่แล้ว
tdammers

9

regex นี้เลือกช่องว่างทั้งหมดคุณสามารถใช้สิ่งนี้และแทนที่ด้วยช่องว่างเดียว

\s+

ตัวอย่างใน python

result = re.sub('\s+',' ', data))

4

ค้นหา[ ]{2,}. จะพบช่องว่างที่อยู่ติดกันสองช่องหรือมากกว่าที่ใดก็ได้ นอกจากนี้ยังจับคู่ช่องว่างนำหน้าและต่อท้ายเช่นเดียวกับเส้นที่ประกอบด้วยช่องว่างทั้งหมด หากคุณไม่ต้องการสิ่งนั้นลองดูคำตอบของ Alexander

อันที่จริงคุณสามารถเว้นวงเล็บไว้เพื่อความชัดเจน (มิฉะนั้นอักขระเว้นวรรคที่ซ้ำกันจะไม่สามารถมองเห็นได้ชัดเจน :))

ปัญหา\s{2,}คือมันจะจับคู่บรรทัดใหม่ในไฟล์ Windows ด้วย (โดยที่บรรทัดใหม่จะแสดงโดยCRLFหรือ\r\nที่จับคู่โดย\s{2}.

[ \t]{2,}หากคุณยังต้องการที่จะหาหลายแท็บและช่องว่างการใช้งาน


more than one space between words in a line. เป็นวิธีการที่[ ]{2,}ระหว่างคำ? คุณอ่านคำถามแล้วหรือยัง?
AlexanderMP

นี่คือเหตุผลที่ฉันได้อ้างถึงคำตอบของคุณในกรณีที่ OP ต้องการเข้มงวดเหมือนที่เขาเขียน บางทีเราควรถามเขา
Tim Pietzcker

2

นี่คือทางออกของฉัน

[^0-9A-Z,\n]

การดำเนินการนี้จะลบตัวเลขเครื่องหมายจุลภาคและบรรทัดใหม่ทั้งหมด แต่เลือกช่องว่างตรงกลางเช่นชุดข้อมูลของ

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