นิพจน์ปกติเพื่อจับคู่อักขระที่เป็นตัวอักษรเท่านั้น


157

ฉันสงสัยว่าถ้าฉันจะได้รับการแสดงออกปกติซึ่งจะตรงกับสตริงที่มีเพียงตัวอักษรและที่อยู่คนเดียว


2
บางอย่างเช่น / ^ [a-zA-Z] + $ / ควรใช้งานได้
Julian Go

10
เป็นàตัวอักษรตามคำนิยามของคุณหรือไม่ คุณใช้ภาษาอะไร
ทิม Pietzcker

2
ควรสตริงว่างเปล่าควรตรงกับ?
ysth

ไม่ต้องสตริงที่ว่างเปล่าไม่ควรตรงกัน
Steffan Harris

หมายเหตุสำคัญหนึ่ง: คุณไม่ได้อ้างอิงภาษาหรือเครื่องมือที่คุณต้องการใช้ regex ที่คุณขอ หลักการของ regexes นั้นค่อนข้างเหมือนกันทุกประการไวยากรณ์ไม่เท่ากันทุกที่ คุณควรอ้างอิงตำแหน่งที่คุณต้องการใช้
sergiol

คำตอบ:


186

คุณสามารถใช้ตัวแปร 2 ตัวต่อไปนี้:

/^[A-Z]+$/i
/^[A-Za-z]+$/

เพื่อจับคู่สตริงอินพุตของตัวอักษร ASCII

  • [A-Za-z] จะตรงกับตัวอักษรทั้งหมด (ทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
  • ^และ$จะทำให้แน่ใจว่าไม่มีอะไรนอกจากตัวอักษรเหล่านี้จะถูกจับคู่

รหัส:

preg_match('/^[A-Z]+$/i', "abcAbc^Xyz", $m);
var_dump($m);

เอาท์พุท:

array(0) {
}

กรณีทดสอบสำหรับความคิดเห็นของ OP ว่าเขาต้องการจับคู่เฉพาะในกรณีที่มีตัวอักษร 1 ตัวขึ้นไปในอินพุต ในขณะที่คุณสามารถมองเห็นในกรณีทดสอบที่ตรงกับความล้มเหลวเพราะมีในสายป้อน^abcAbc^Xyz

หมายเหตุ:โปรดทราบว่าคำตอบข้างต้นตรงกับตัวอักษร ASCII เท่านั้นและไม่ตรงกับอักขระ Unicode หากคุณต้องการจับคู่ตัวอักษร Unicode ให้ใช้:

/^\p{L}+$/u

ที่นี่\p{L}ตรงกับตัวอักษรทุกชนิดจากภาษาใด ๆ


22
ในบางภาษา [Az] จะจับคู่ค่าเครื่องหมายวรรคตอน ASCII ที่เกิดขึ้นระหว่าง 'Z' และ 'a' โดยเฉพาะ '[', '\', ']', '^', '-' และ '`' ตามที่ เช่นเดียวกับ 'A' ถึง 'Z' และ 'a' ถึง 'z'
ลี

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

7
@Lee: ไม่บาง พวกเขาทุกคน. regex นี้ผิดในสถานะปัจจุบัน
ทิม Pietzcker

7
\w is shorthand for A-Za-z- ไม่จริง\wเป็นชวเลขสำหรับ[a-zA-Z0-9_]
anubhava

1
จุดดี @ jpmc26 ฉันได้แก้ไขคำตอบของฉันเพื่อลบข้อผิดพลาดเดิมของฉัน
anubhava

55

หากคุณต้องการรวมอักขระที่ไม่ใช่ตัวอักษร ASCII และถ้ารสชาติ regex ของคุณรองรับ Unicode

\A\pL+\z

จะเป็น regex ที่ถูกต้อง

เอ็นจิน regex บางตัวไม่รองรับไวยากรณ์ Unicode นี้ แต่อนุญาตให้\wตัวอักษรและตัวเลขสั้น ๆ จับคู่อักขระที่ไม่ใช่ ASCII ในกรณีนี้คุณสามารถรับตัวอักษรทั้งหมดโดยการลบตัวเลขและขีดล่างออกจาก\wแบบนี้:

\A[^\W\d_]+\z

\Aจับคู่ที่จุดเริ่มต้นของสตริง\zที่ส่วนท้ายของสตริง ( ^และ$ตรงกับที่จุดเริ่มต้น / สิ้นสุดของบรรทัดในบางภาษาเช่น Ruby หรือหากมีการตั้งค่าตัวเลือก regex บางอย่าง)


38
+1 สำหรับการไม่พิจารณาตัวอักษรภาษาอังกฤษเป็นตัวอักษรเท่านั้น
srcspider

7
+1 เหมือนข้างบน ภาษาอังกฤษไม่ใช่ตัวอักษรเพียงตัวเดียวและหลายคนเขียนชื่อโดยใช้อักขระที่ไม่ใช่ ASCII เพื่อแสดงความถูกต้อง
Ben Barkay

22

สิ่งนี้จะจับคู่อักขระที่มีตัวอักษรอย่างน้อยหนึ่งตัว:

/^[a-z]+$/

คุณสามารถทำให้ตัวพิมพ์เล็กและใหญ่ตายได้โดยใช้:

/^[a-z]+$/i

หรือ:

/^[a-zA-Z]+$/

สิ่งนี้จะตรงกับอักขระละตินเท่านั้น
QuotesBro

13

ใน Ruby และภาษาอื่น ๆ ที่สนับสนุนคลาสอักขระ POSIX ในนิพจน์วงเล็บเหลี่ยมคุณสามารถทำได้ง่ายๆ:

/\A[[:alpha:]]+\z/i

ที่จะตรงกับตัวอักษรในทุกภาษาตัวอักษร Unicode peasy ง่าย ๆ

ข้อมูลเพิ่มเติม: http://en.wikipedia.org/wiki/Regular_expression#Character_classes http://ruby-doc.org/core-2.0/Regexp.html


1
และเพื่อให้ได้ทุกอย่าง แต่ตัวละครเหล่านั้น (ซึ่งไม่ได้มีการบันทึกไว้) [^[:alpha]]การใช้งาน
spyle

6

[a-zA-Z] ควรทำเช่นนั้นได้ดี

คุณสามารถอ้างอิงแผ่นโกง


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