จะจับคู่อักขระที่ไม่ใช่ช่องว่างยกเว้นอักขระใดตัวหนึ่งได้อย่างไร


111

ใน Perl จะ\Sจับคู่อักขระที่ไม่ใช่ช่องว่าง

ฉันจะจับคู่อักขระที่ไม่ใช่ช่องว่างยกเว้นแบ็กสแลชได้\อย่างไร

คำตอบ:


154

คุณสามารถใช้คลาสอักขระ :

/[^\s\\]/

\ตรงกับสิ่งที่ไม่ได้เป็นตัวละครที่ช่องว่างหรือมิได้ นี่คือตัวอย่างอื่น:

[abc]หมายถึง "การแข่งขันa, bหรือc"; [^abc]หมายถึง "ตรงกับตัวอักษรใด ๆ ยกเว้นa, bหรือc"


เมื่อใดถูก^ตีความว่าเป็นการปฏิเสธและเมื่อใดที่เริ่มต้นบรรทัด ในแง่นั้นเหตุใดสิ่งนี้จึงไม่ตรงกับบรรทัดที่เริ่มต้นด้วยจำนวนช่องว่างสีขาว$0~/\s*^\s/
Alexander Cska

1
นอกคลาสอักขระคือ "จุดเริ่มต้นของสตริง" (หรือบรรทัดขึ้นอยู่กับโหมดการจับคู่ปัจจุบัน) ภายในคลาสอักขระและเฉพาะในกรณีที่เป็นอักขระตัวแรกหลังวงเล็บเปิดมันจะลบล้างเนื้อหาของคลาสอักขระ
Tim Pietzcker

บรรทัดการจับคู่ต่อไปนี้จะขึ้นต้นด้วยช่องว่างสีขาว$0~/\s*^\s/ตามด้วยอักขระใด ๆ ที่ไม่ใช่ช่องว่างสีขาว
Alexander Cska

1
นั่นควรจะเป็น/^\s+/- จุดเริ่มต้นของบรรทัดตามด้วยอักขระช่องว่างอย่างน้อยหนึ่งอักขระ
Tim Pietzcker

1
@AlexanderCska คุณคิดออกหรือยัง? คำตอบข้างต้นจะแสดงผลเฉพาะสตริงแรกเท่านั้น หากคุณต้องการส่งคืนรายการที่ตรงกันทั้งหมดให้เพิ่มgตัวปรับแต่ง /[^\s\\]/g
Ben Carp

14

คุณสามารถใช้ Lookahead:

/(?=\S)[^\\]/

2
มองไปข้างหน้าหากไม่ใช่ช่องว่าง จากนั้นคลาสลบจะยอมรับอะไรก็ได้ (ซึ่งไม่ใช่ช่องว่าง) ยกเว้นอักขระในคลาสของคุณ
Denis de Bernardy

ฉันชอบวิธีนี้ เป็นเรื่องที่ดีสำหรับสิ่งต่างๆเช่น "ให้อักขระที่ไม่ใช่คำทั้งหมดยกเว้นช่องว่าง":/(?=\S)\W/
jocull

ฉันมีสถานการณ์ที่ฉันต้องการจับคู่อักขระที่ไม่ใช่ช่องว่างและไม่ใช่เครื่องหมายคำพูด นอกจากนี้ยังต้องอนุญาตสำหรับ SPACES เช่น: THIS IS A TEST, AND AGAIN. (?=\S)[^"]*ต่อไปนี้จะทำงานได้ดีสำหรับฉัน
Arvo Bowen

คำตอบที่ยอมรับไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้ ฉันใช้สิ่งนี้ในการค้นหา regex ข้อความประเสริฐ
Christian Noel

5

สิ่งนี้ใช้ได้ผลสำหรับฉันโดยใช้sed [ แก้ไข:ความคิดเห็นด้านล่างชี้ให้เห็นว่า sed ไม่สนับสนุน \ s]

[^ ]

ในขณะที่

[^\s] 

ไม่ได้

# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg

echo "ghai ghai" | sed "s/[^ g]//g"
g g

3
\sจับคู่มากกว่าอักขระช่องว่าง ซึ่งรวมถึง TAB การส่งคืนรถป้อนบรรทัดและอื่น ๆ ( จำนวนอื่น ๆ ขึ้นอยู่กับรสชาติ regex) มันเป็นสิ่งประดิษฐ์ของ Perl แต่เดิมเป็นชวเลขสำหรับคลาสอักขระ POSIX [:space:]และไม่รองรับในsed. regex s/[^[:space:]g]//gแรกของคุณดังกล่าวข้างต้นควรจะเป็น
Alan Moore

Yup @AlanMoore works: Yields echo "ghai ghai" | sed "s/[^[:space:]g]//g" :g g
storm_m2138

1

ในระบบของฉัน: CentOS 5

ฉันสามารถใช้\sนอกคอลเลกชันได้ แต่ต้องใช้[:space:]ภายในคอลเลกชัน อันที่จริงฉันสามารถ[:space:]ใช้ได้เฉพาะในคอลเลกชันเท่านั้น ดังนั้นเพื่อให้ตรงกับพื้นที่เดียวโดยใช้สิ่งนี้ฉันต้องใช้[[:space:]] ซึ่งแปลกจริงๆ

echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"

Result: a b cX
  • ช่องว่างแรกที่ฉันจับคู่ด้วย \s
  • ช่องว่างที่สองที่ฉันจับคู่หรือไม่ก็ได้ [[:space:]]
  • XI ตรงกับ "ทั้งหมดยกเว้นไม่เว้นวรรค" [^[:space:]]

สองสิ่งนี้จะไม่ทำงาน:

a[:space:]b  instead use a\sb or a[[:space:]]b

a[^\s]b      instead use a[^[:space:]]b

1
สำหรับ sed 4.4 เห็นได้ชัดว่ายังคงเป็นความจริงที่คุณต้องใช้([^[:space:]])แทน([^\s]). I'm on openSUSE Tumbleweed 2018 04 03.
user2394284
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.