Regex เพื่อให้ตรงกับตัวอักษรเท่านั้น


374

ฉันจะเขียน regex ที่ตรงกับตัวอักษรเท่านั้นได้อย่างไร


58
คำจำกัดความของcharactersคุณคืออะไร ASCII? Kanji? Iso-XXXX-X? UTF8?
Ivo Wetzel

45
คำจำกัดความของregexคุณคืออะไร Perl? Emacs? grep?
Pascal Cuoq

4
ระบุว่าคำถามเป็นภาษาอังกฤษบนเว็บไซต์ภาษาอังกฤษมันยุติธรรมที่จะถือว่าคำถามเกี่ยวกับตัวอักษรเป็นภาษาอังกฤษ
vaer-k

1
ฉันได้สังเกตว่า\ p {L}สำหรับตัวอักษรและ/ uธงสำหรับ Unicode ตรงกับตัวอักษรใด ๆ ใน regex ของฉัน/\p{L}+/u
MaxZoom

4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. นี่เป็นเรื่องจริง ดังที่เราทุกคนรู้กันดีว่าผู้พูดภาษาอังกฤษไม่เคย จำกัด การใช้งานของพวกเขา!
อเล็กซ์

คำตอบ:


392

ใช้ชุดอักขระ: [a-zA-Z]ตรงกับตัวอักษรหนึ่งตัวจาก A – Z เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ [a-zA-Z]+ตรงกับตัวอักษรหนึ่งตัวหรือมากกว่าและ^[a-zA-Z]+$จับคู่เฉพาะสตริงที่ประกอบด้วยตัวอักษรหนึ่งตัวหรือมากกว่าเท่านั้น ( ^และ$ทำเครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดของสตริงตามลำดับ)

ถ้าคุณต้องการเพื่อให้ตรงกับตัวอักษรอื่น ๆ กว่า A-Z, [a-zA-ZäöüßÄÖÜ]คุณสามารถเพิ่มลงในชุดตัวอักษร: หรือคุณใช้ชั้นเรียนตัวอักษรที่กำหนดไว้ล่วงหน้าเช่นคุณสมบัติอักขระ Unicodeระดับ\p{L}ที่อธิบายตัวอักษร Unicode ที่มีตัวอักษร


119
นั่นเป็นโซลูชันที่มีศูนย์กลางเป็น ASCII มาก สิ่งนี้จะทำลายข้อความที่ไม่ใช่ภาษาอังกฤษ
Joachim Sauer

7
@Joachim Sauer: มันค่อนข้างจะทำลายภาษาที่ใช้อักขระที่ไม่ใช่ละติน
Gumbo

15
แบ่ง 90% ของข้อความภาษาเยอรมันแล้วไม่ต้องพูดถึงภาษาฝรั่งเศสหรือสเปน อิตาลีอาจยังคงทำได้ค่อนข้างดี
Ivo Wetzel

9
ขึ้นอยู่กับนิยามของ "ตัวอักษรละติน" ที่คุณเลือก J, U, Ö, Äสามารถโต้แย้งกันได้ว่าเป็นตัวอักษรละตินหรือไม่ขึ้นอยู่กับคำจำกัดความของคุณ แต่พวกเขาทั้งหมดจะใช้ในภาษาที่ใช้ "ตัวอักษรละติน" สำหรับการเขียน
Joachim Sauer

9
\ p {L} จับคู่เสียง umlauts sedilla ฯลฯ ดังนั้นคุณควรไปกับมัน
Radu Simionescu

198

\p{L} จับคู่สิ่งที่เป็นตัวอักษร Unicode หากคุณสนใจตัวอักษรที่เกินละติน


2
ไม่ได้อยู่ในทุกรสชาติของ regex ตัวอย่างเช่น vim regexes ถือว่า\pเป็น "อักขระที่พิมพ์ได้"
ฟิลิปพอตเตอร์

3
หน้านี้แนะนำเฉพาะการรองรับ regexes java, .net, perl, jgsoft, XML และ XPath เท่านั้น \ p {L} แต่การละเว้นที่สำคัญ: python และ ruby ​​(แม้ว่า python มีโมดูล regex)
Philip Potter

6
@Philip Potter: Ruby รองรับคุณสมบัติอักขระ Unicode โดยใช้ไวยากรณ์เดียวกันนั้น
Jörg W Mittag

6
ฉันคิดว่าสิ่งนี้ควรจะ\p{L}\p{M}*+ครอบคลุมตัวอักษรที่ประกอบด้วย codepoints หลายตัวเช่นจดหมายตามด้วยเครื่องหมายเน้นเสียง เป็นต่อregular-expressions.info/unicode.html
ZoFreX

ด้วย python 3 นี่ทำให้เกิดข้อผิดพลาดbad escape \p at position 0
matanster

46

ขึ้นอยู่กับความหมายของ "อักขระ":

[A-Za-z]- ตัวอักษรทั้งหมด(ตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก)

[^0-9] - อักขระที่ไม่ใช่ตัวเลขทั้งหมด


ฉันหมายถึงตัวอักษร ดูเหมือนว่าจะไม่ทำงาน preg_match ('/ [a-zA-Z] + /', $ name);
Nike

[A-Za-z] เป็นเพียงการประกาศตัวอักขระที่คุณสามารถใช้ได้ คุณยังต้องประกาศจำนวนครั้งที่ต้องใช้การประกาศนี้: [A-Za-z] {1,2} (เพื่อให้ตรงกับ 1 หรือ 2 ตัวอักษร) หรือ [A-Za-z] {1, *} (เพื่อจับคู่ 1 ตัวอักษรขึ้นไป)
KristofMols

17
well à, á, ã, Ö, Ä ... เป็นตัวอักษรเช่นกันดังนั้น are, আ, ই, ঈ, Є, Ж, З, З, ﺥ, בא, ב, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv

@phuclv: แน่นอน แต่ขึ้นอยู่กับการเข้ารหัสและการเข้ารหัสเป็นส่วนหนึ่งของการตั้งค่าของโปรแกรม (ทั้งการกำหนดค่าเริ่มต้นหรือการตั้งค่าที่ประกาศในไฟล์กำหนดค่าของโปรแกรม) เมื่อฉันทำงานกับภาษาต่าง ๆ ฉันเคยเก็บไว้ในค่าคงที่ในไฟล์กำหนดค่า
Catalina Chircu

1
@CatalinaChircu การเข้ารหัสไม่เกี่ยวข้องอย่างแน่นอนที่นี่ การเข้ารหัสเป็นวิธีเข้ารหัสจุดรหัสในชุดอักขระในไบนารีตัวอย่างเช่น UTF-8 เป็นการเข้ารหัสสำหรับ Unicode ตัวอักษร OTOH ขึ้นอยู่กับภาษาและหากมีคนบอกว่า[A-Za-z]เป็นตัวอักษรภาษาที่ใช้จะต้องถูกระบุ
phuclv

32

ตัวเลือกที่ใกล้เคียงที่สุดคือ

[\u\l]+

ซึ่งตรงกับลำดับตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก อย่างไรก็ตามมันไม่ได้รับการสนับสนุนจากบรรณาธิการ / ภาษาทั้งหมดดังนั้นจึงอาจปลอดภัยกว่าที่จะใช้

[a-zA-Z]+

ตามที่ผู้ใช้คนอื่นแนะนำ


1
จะไม่จับคู่อักขระพิเศษใด ๆ
Nyerguds

20

คุณจะใช้

/[a-z]/gi

[] - ตรวจสอบตัวละครใด ๆ ระหว่างอินพุตที่กำหนด

az --- ครอบคลุมตัวอักษรทั้งหมด

g ----- ทั่วโลกตลอดทั้งสาย

ฉัน ----- รับบนและตัวพิมพ์เล็ก


14

การแสดงออกปกติที่มีคนไม่กี่คนเขียนว่า "/ ^ [a-zA-Z] $ / i" ไม่ถูกต้องเพราะในที่สุดพวกเขาได้พูดถึง/ iซึ่งเป็นกรณีที่ไม่มีความรู้สึกและหลังจากจับคู่เป็นครั้งแรกมันจะกลับมา แทนที่จะเป็น/ ฉันเพียงแค่ใช้/ gซึ่งเป็นของโลกและคุณไม่จำเป็นต้องใส่^ $สำหรับการเริ่มต้นและสิ้นสุด

/[a-zA-Z]+/g
  1. [a-z _] +จับคู่อักขระเดี่ยวที่ปรากฏในรายการด้านล่าง
  2. ปริมาณ: +ระหว่างหนึ่งและไม่ จำกัด จำนวนครั้งมากที่สุดเท่าที่เป็นไปได้ให้กลับตามที่ต้องการ
  3. azอักขระเดี่ยวในช่วงระหว่าง a และ z (ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
  4. อาริโซน่าเป็นอักขระตัวเดียวในช่วงระหว่าง A ถึง Z (เล็กและใหญ่)
  5. g โมดิฟายเออร์: global การแข่งขันทั้งหมด (ไม่กลับมาในนัดแรก)




7

ใช้กลุ่มตัวละคร

\D

ตรงกับตัวละครใด ๆ ยกเว้นตัวเลข 0-9

^\D+$

ดูตัวอย่างได้ที่นี่


8
สิ่งนี้จะตรงกับช่องว่างสัญลักษณ์และอื่น ๆ ซึ่งดูเหมือนจะไม่ใช่คำถามที่ถาม
DaveMongoose

แปลก. เพิ่งได้รับการโหวตเกี่ยวกับเรื่องนี้และมันไม่ใช่ฉัน!
Dave Everitt

6

เพียงแค่ใช้หรือ\w [:alpha:]มันเป็นลำดับหนีที่ตรงกับสัญลักษณ์เท่านั้นที่อาจปรากฏในคำพูด


9
\wอาจไม่ใช่ทางออกที่ดีในทุกกรณี อย่างน้อยใน PCRE \wสามารถจับคู่อักขระอื่น ๆ ได้เช่นกัน การอ้างถึงคู่มือ PHP : อักขระ " A" word "คือตัวอักษรหรือตัวเลขใด ๆ หรืออักขระขีดล่างคืออักขระใด ๆ ที่สามารถเป็นส่วนหนึ่งของ Perl" word "คำจำกัดความของตัวอักษรและตัวเลขถูกควบคุมโดยตารางอักขระของ PCRE และอาจแตกต่างกันหากการจับคู่เฉพาะสถานที่เกิดขึ้นตัวอย่างเช่นในโลแคล "fr" (ฝรั่งเศส) รหัสอักขระบางตัวที่มากกว่า 128 จะใช้สำหรับตัวอักษรที่เน้นเสียงและสิ่งเหล่านี้จะถูกจับคู่โดย \ w .
Amal Murali

คำรวมตัวละครอื่น ๆ จากตัวอักษร
V-SHY

2
\wหมายถึงการจับคู่ตัวอักษรและตัวเลข
Eugen Konkov

4

หากคุณหมายถึงตัวอักษรใด ๆ ในการเข้ารหัสอักขระวิธีการที่ดีอาจเป็นการลบตัวอักษรที่ไม่ใช่ช่องว่าง\sตัวเลข\dและตัวอักษรพิเศษอื่น ๆ เช่น:

[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]

หรือใช้การปฏิเสธของการปฏิเสธข้างต้นเพื่ออธิบายตัวอักษรใด ๆ โดยตรง:

\S \D and [^  ..special chars..]

ข้อดี:

  • ใช้ได้กับทุกรสชาติของ regex
  • ง่ายต่อการเขียนบางครั้งประหยัดเวลามาก

จุดด้อย:

  • ยาวบางครั้งก็ไม่สมบูรณ์แบบ แต่การเข้ารหัสอักขระอาจแตกได้เช่นกัน

4

คุณสามารถลองนี้แสดงออกปกติ: หรือ[^\W\d_][a-zA-Z]


นั่นไม่ใช่ความ[^\W|\d]หมาย
OGHaza

1
[^\W|\d]ไม่ได้หมายถึง\Wและไม่ได้และไม่ได้| \dมันมีผลกระทบสุทธิเหมือนกันเนื่องจาก|เป็นส่วนหนึ่ง\Wแต่|ไม่ได้ผลอย่างที่คุณคิด ถึงอย่างนั้นก็หมายความว่ามันยอมรับ_ตัวละคร คุณอาจกำลังมองหา[^\W\d_]
OGHaza

_ผมเห็นด้วยกับคุณก็ยอมรับ แต่ "ไม่" |เท่ากับ "และ" ดังนั้น[^\W|\d]หมายความว่า: ไม่\W และไม่\d
Motlab

12
[^ab]ไม่ได้หมายถึงและไม่ได้a ไม่ได้หมายถึงและไม่ได้และไม่ได้ เพื่อให้เป็นตัวอย่างที่สองคือเหมือนกับซึ่งเป็นเหมือนกับ- ทั้งหมดที่ถือเอาการเป็นตัวละครที่แท้จริงไม่ได้เป็นผู้ประกอบการหรือ ตัวดำเนินการ OR ถูกเชื่อมโยงระหว่างอักขระแต่ละตัวในคลาสอักขระการใส่ค่าจริงที่คุณต้องการให้คลาสยอมรับอักขระ (ไพพ์) b[^a|b]a|b[a|b|c|d][abcd|||][abcd|]([a]|[b]|[c]|[d]|[|])|||
OGHaza

1

เมื่อเร็ว ๆ นี้ฉันได้ใช้รูปแบบนี้ในรูปแบบของฉันเพื่อตรวจสอบชื่อของคนที่มีตัวอักษรช่องว่างและตัวอักษรพิเศษเช่นเครื่องหมายเน้นเสียง

pattern="[A-zÀ-ú\s]+"

คุณควรดูตาราง ASCII A-zจับคู่มากกว่าแค่ตัวอักษรและÀ-ú
โตโต้

0

รูปแบบ = / [a-zA-Z] /

ใส่ "[a-zA-Z]: # {pattern.match (" mine blossom ")}" ตกลง

ใส่ "[a-zA-Z]: # {pattern.match (" 456 ")}"

ใส่ "[a-zA-Z]: # {pattern.match (" ")}"

ใส่ "[a-zA-Z]: # {pattern.match (" # $% ^ & * ")}"

ใส่ "[a-zA-Z]: # {pattern.match (" # $% ^ & * A ")}" ตกลง


3
และตัวอย่างเช่น“ Zażółćgęsląjaźń”?
พยานฯ

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