นิพจน์ปกติเพื่ออนุญาตให้มีช่องว่างระหว่างคำ


191

ฉันต้องการนิพจน์ทั่วไปที่ป้องกันสัญลักษณ์และอนุญาตเฉพาะตัวอักษรและตัวเลข regex ด้านล่างใช้งานได้ดี แต่ไม่อนุญาตให้มีช่องว่างระหว่างคำ

^[a-zA-Z0-9_]*$

ตัวอย่างเช่นเมื่อใช้นิพจน์ทั่วไป "HelloWorld" นั้นใช้ได้ แต่ "Hello World" ไม่ตรงกัน

ฉันจะปรับแต่งเพื่อให้มีช่องว่างได้อย่างไร

คำตอบ:


372

TL; DR

เพียงแค่เพิ่มพื้นที่ในของตัวละครคลาส

^[a-zA-Z0-9_ ]*$

 


ตอนนี้ถ้าคุณต้องการเข้มงวด ...

ด้านบนไม่ถูกต้อง เนื่องจากความจริงที่*หมายถึงศูนย์หรือมากกว่านั้นจะจับคู่ทุกกรณีต่อไปนี้ซึ่งมักจะไม่ตรงกับ:

  • สตริงว่าง ""
  • สตริงประกอบด้วยช่องว่างทั้งหมด ""
  • สตริงที่นำไปสู่และ / หรือเส้นทางที่มีช่องว่าง "Hello World"
  • สตริงที่มีช่องว่างหลายช่องระหว่างคำว่า "Hello World"

แต่เดิมฉันไม่คิดว่ารายละเอียดดังกล่าวมีค่าควรแก่การเข้าร่วมเพราะ OP ได้ถามคำถามพื้นฐานที่ดูเหมือนว่าความเข้มงวดไม่ได้เป็นปัญหา ตอนนี้คำถามได้รับความนิยม แต่ฉันต้องการจะบอกว่า ...

... ใช้@ คำตอบของ

ซึ่งในรสชาติของฉัน (ไม่ใช้\w) แปลเป็น:

^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$

(โปรดโหวต @stema โดยไม่คำนึงถึง)

บางสิ่งที่ควรทราบเกี่ยวกับคำตอบ (และของ @ stema) นี้:

  • หากคุณต้องการอนุญาตให้มีช่องว่างระหว่างคำหลายคำ (เช่นถ้าคุณต้องการอนุญาตให้เว้นวรรคสองครั้งโดยไม่ตั้งใจหรือหากคุณกำลังทำงานกับข้อความที่คัดลอกมาจาก PDF) ให้เพิ่มอีกหนึ่งช่อง+หลัง

    ^\w+( +\w+)*$
  • หากคุณต้องการอนุญาตแท็บและบรรทัดใหม่ (อักขระช่องว่าง) ให้แทนที่ช่องว่างด้วย\s+:

    ^\w+(\s+\w+)*$

    ที่นี่ฉันแนะนำ+โดยค่าเริ่มต้นเพราะตัวอย่างเช่น linebreaks ของ Windows ประกอบด้วยอักขระช่องว่างสองตัวตามลำดับ\r\nดังนั้นคุณจะต้อง+จับทั้งคู่

ยังไม่ทำงานใช่ไหม

ตรวจสอบภาษาที่คุณใช้ *ในภาษาเช่น Java คุณจะต้องหลบหนีออกเครื่องหมายของคุณคือ และ\\w \\sในภาษาแก่กว่าหรือขั้นพื้นฐานมากขึ้นและระบบสาธารณูปโภคเช่นsed, \wและ\sไม่ได้กำหนดไว้เพื่อให้พวกเขาเขียนออกมาพร้อมกับการเรียนของตัวละครเช่น [a-zA-Z0-9_]และ[\f\n\p\r\t]ตามลำดับ

 


*ฉันรู้ว่าคำถามนี้ถูกแท็กแต่ขึ้นอยู่กับการดูมากกว่า 25,000 ครั้งฉันเดาว่าไม่ใช่เฉพาะคนที่เจอคำถามนี้เท่านั้น ขณะนี้ก็เป็นครั้งแรกใน google คำค้นหาแสดงออกปกติคำพื้นที่


3
มันช่วยให้สตริงที่ว่างเปล่า
Neha Choudhary

1
ว้าวง่ายมาก! ขอบคุณ ไม่ได้มีเว็บไซต์หรือสิ่งหนึ่งที่สามารถใช้ในการสร้างการแสดงออก regex สำหรับ noobs ผมหมายถึง ...
ปิแอร์

1
@ เปียร์ - มันค่อนข้างยากที่จะทำตามคำแนะนำของมนุษย์และแปลงเป็นกฎที่ชัดเจน (ภาษามนุษย์คล่องแคล่วและเต็มไปด้วยความคลุมเครือและสมองของเราทำงานส่วนใหญ่ที่จำเป็นในการแก้ไขสิ่งต่าง ๆ และเติมช่องว่างคอมพิวเตอร์ไม่ได้มีสมองเช่นนี้ ) มีเครื่องมือที่มีอยู่เช่นdebuggex.comที่แสดงถึง regex ของคุณด้วยสายตา แต่น่าสนใจเพราะมันอาจจะไม่เป็นประโยชน์สำหรับผู้เริ่มต้นที่สมบูรณ์ ฉันขอแนะนำการสอนแบบอินเทอร์แอคทีฟเพื่อให้พื้นฐานลดลง
Andrew Cheong

1
ใช่ regex ของคุณจะจับคู่หากมีช่องว่าง คำตอบของฉันคือความคิดเห็นของ Neha choudary
Rajshekar Reddy

1
@ เปียโนสามปีต่อมา - ฉันเจอคำถามนี้ในวันนี้เห็นความคิดเห็นของคุณ; ฉันใช้ฮีโร่ของ regex ( regexhero.net ) เพื่อทดสอบนิพจน์ทั่วไป ฉันคิดว่าเวอร์ชันออนไลน์ใช้งานได้เฉพาะใน Internet Explorer ด้วย Silverlight แต่ก็ดีกว่าไม่มีอะไร
Michael Armes

121

ความเป็นไปได้อย่างหนึ่งคือการเพิ่มพื้นที่ลงในคลาสตัวละครของคุณตามที่แนะนำ acheong87 สิ่งนี้ขึ้นอยู่กับว่าคุณเข้มงวดกับรูปแบบของคุณมากแค่ไหนเพราะมันจะอนุญาตให้มีสตริงที่ขึ้นต้นด้วย 5 ช่องว่าง

ความเป็นไปได้อื่นคือการกำหนดรูปแบบ:

ฉันจะใช้\wสิ่งนี้ในรสชาติ regex ส่วนใหญ่เหมือนกัน[a-zA-Z0-9_](ในบางมันเป็น Unicode ตาม)

^\w+( \w+)*$

สิ่งนี้จะอนุญาตให้มีชุดของคำอย่างน้อยหนึ่งคำและแบ่งคำด้วยช่องว่าง

^ จับคู่จุดเริ่มต้นของสตริง

\w+ จับคู่ชุดอักขระอย่างน้อยหนึ่งคำ

( \w+)*คือกลุ่มที่มีการทำซ้ำ 0 ครั้งขึ้นไป ในกลุ่มคาดว่าจะมีช่องว่างตามด้วยชุดอักขระอย่างน้อยหนึ่งคำ

$ ตรงกับจุดสิ้นสุดของสตริง


นี่คือregex101.com/#javascriptยังให้คำอธิบายที่ดีสำหรับรูปแบบ regex ที่คุณต้องการวิเคราะห์
Dark Star1

Nice Regex ง่ายกว่านั้นมาก [0-9a-z] ฯลฯ
George


12

ลองด้วย:

^(\w+ ?)*$

คำอธิบาย:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional

2
นี่จะทำให้เกิดการย้อนรอยนรก
พฤศจิกายน

1
ตัวอย่างเช่นเนื่องจากสตริงที่ไม่ตรงกันggggggggggggggggggggggggggggggggggggg;regex ของคุณจะใช้เวลานานมากในการเข้าถึงผลลัพธ์เนื่องจากมีการย้อนรอยมากเกินไป
พฤศจิกายน

ตกลงคุณแนะนำอะไร
hsz

7

ฉันถือว่าคุณไม่ต้องการพื้นที่นำหน้า / ต่อท้าย ซึ่งหมายความว่าคุณต้องแบ่ง regex เป็น "ตัวอักษรตัวแรก", "สิ่งที่อยู่ตรงกลาง" และ "ตัวละครตัวสุดท้าย":

^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$

หรือถ้าคุณใช้ไวยากรณ์แบบ perl:

^\w[\w ]*\w$

นอกจากนี้: หากคุณใช้คำว่า regex ของคุณโดยเจตนาว่าอนุญาตให้ใช้สตริงที่ว่างเปล่าคุณจะต้องทำให้เป็นตัวเลือกทั้งหมด:

^(\w[\w ]*\w)?$

หากคุณต้องการอนุญาตให้ใช้อักขระช่องว่างเดียวเท่านั้นมันจะแตกต่างกันเล็กน้อย:

^((\w+ )*\w+)?$

ตรงนี้ 0..n คำตามด้วยเว้นวรรคเดียวบวกหนึ่งคำโดยไม่มีช่องว่าง และทำให้ทุกอย่างเป็นตัวเลือกเพื่ออนุญาตให้มีสตริงว่าง


พื้นที่และ\sไม่เท่ากัน \sจับคู่มากกว่าแค่อวกาศ
nhahtdh

@nhahtdh: ขอบคุณสำหรับความคิดเห็น ฉันคุ้นเคยกับการจับคู่ช่องว่างโดยทั่วไปฉันเดา .. คำตอบคงที่
creinig

เป็นไปได้ไหมว่าคุณไม่มีวงเล็บปิดอยู่) ในนิพจน์แรก ฉันไม่แน่ใจว่าฉันไม่ได้ลอง
ssinfod

@ssinfod: จับได้ดี ในความเป็นจริงวงเล็บเปิดนั้นไม่จำเป็นในตัวอย่างนั้น ขอบคุณ
creinig

4

การแสดงออกปกตินี้

^\w+(\s\w+)*$

จะอนุญาตเว้นวรรคเดียวระหว่างคำและไม่มีช่องว่างนำหน้าหรือต่อท้าย

ด้านล่างนี้เป็นคำอธิบายของนิพจน์ทั่วไป:

  1. ^ ยืนยันตำแหน่งที่จุดเริ่มต้นของสตริง
  2. \w+ จับคู่อักขระคำใด ๆ [a-zA-Z0-9_]
    1. ปริมาณ: +ระหว่างหนึ่งและไม่ จำกัด ครั้งมากที่สุดเท่าที่เป็นไปได้ให้กลับตามที่ต้องการ [โลภ]
  3. กลุ่มที่ 1 (\s\w+)*
    1. ปริมาณ: *ระหว่างเวลาเป็นศูนย์และไม่ จำกัด เท่าที่จะเป็นไปได้ให้กลับคืนมาตามที่ต้องการ [โลภ]
    2. \s จับคู่อักขระช่องว่างใด ๆ [\r\n\t\f ]
    3. \w+ จับคู่อักขระคำใด ๆ [a-zA-Z0-9_]
      1. ปริมาณ: +ระหว่างหนึ่งและไม่ จำกัด ครั้งมากที่สุดเท่าที่เป็นไปได้ให้กลับตามที่ต้องการ [โลภ]
  4. $ ยืนยันตำแหน่งที่ส่วนท้ายของสตริง

2

สิ่งนี้ไม่อนุญาตให้มีพื้นที่ว่างในการเริ่มต้น แต่อนุญาตให้มีช่องว่างระหว่างคำ ยังช่วยให้ตัวละครพิเศษระหว่างคำ regex ที่ดีสำหรับเขตข้อมูลชื่อและนามสกุล

\w+.*$

คำตอบนี้ไม่ถูกต้อง / ไม่ถูกต้อง รูปแบบนี้ตรงกับตัวอักษรและตัวเลขขีดเส้นใต้หนึ่งตัวหรือมากกว่าหนึ่งตัวจากนั้นจะมีอักขระที่ไม่ใช่บรรทัดใหม่เป็นศูนย์หรือมากกว่า ไม่ดีสำหรับ OP
mickmackusa

2

สำหรับตัวอักษรเท่านั้น:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

สำหรับค่าตัวอักษรและตัวเลขและ_:

^(\w)+(\s)+\w+$

1
มันไม่ใช่ตัวอย่างที่ดีเพราะ (บางสิ่ง) + ไม่เหมือนกับ (บางอย่าง +) ในตัวอย่างแรกเฉพาะอักขระเดียวเท่านั้นที่จะถูกจับเป็น $ 1
Znik

0

ลองสิ่งนี้: (เวอร์ชั่น Python)

"(A-Za-z0-9 ){2, 25}"

เปลี่ยนขีด จำกัด สูงสุดตามชุดข้อมูลของคุณ


0

เพียงเพิ่มช่องว่างเพื่อวางรูปแบบ regex ของคุณดังนี้:

[a-zA-Z0-9_ ]

-1

ลองดูคำตอบที่ควรมีมากมายเหล่านี้ดูดี ...

... และ bupkis หลังจากกำจัด Stack Overflow เช่นเดียวกับไซต์อื่น ๆ สำหรับ regex ที่จับคู่สตริงใด ๆ ที่ไม่มีการเริ่มต้นหรือต่อท้าย white-space และเว้นวรรคเดียวระหว่างคำตัวอักษรอัลฟ่าอย่างเคร่งครัด

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

จึงแก้ไขได้อย่างง่ายดายเพื่อตัวอักษรและตัวเลข:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(สิ่งนี้ไม่ตรงกับคำเดี่ยว แต่ใช้สวิตช์ / if-else แบบง่าย^[a-zA-Z0-9]+$ถ้าคุณต้องการจับคำเดียวนอกจากนี้)

เพลิดเพลินไปกับ: D


3
[(?<=\d\s]ตรงกับตัวละครตัวหนึ่ง: (, ?, <, =, ตัวเลขหรือตัวอักษรช่องว่างและที่ไม่สามารถเป็นสิ่งที่คุณหมาย ถ้ามันควรจะเป็นระวัง(?<=\d\s)แต่มันก็ไม่สมเหตุสมผล regex จะไม่ตรงกัน
Alan Moore

สำหรับ upvoters: โปรดอย่า upvote วิธีแก้ไขที่ผิด พวกเขาทำให้ผู้ใช้สับสนและทำให้พวกเขาเชื่อว่า regex สามารถทำสิ่งที่มันไม่ได้
Wiktor Stribiżew


-4

ลอง .*? เพื่ออนุญาตให้ใช้ช่องว่างสีขาวได้


นั่นเป็นเพราะการ.จับคู่ทุกอย่าง นี่น่าจะเป็นทางออกที่นี่ไม่ได้
rubik

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