Regex เพื่อจับคู่ตัวเลขสองหรือสี่ครั้ง


96

เป็นคำถามง่ายๆเกี่ยวกับนิพจน์ทั่วไป แต่ฉันไม่พบคำตอบ

ฉันต้องการตรวจสอบว่าตัวเลขปรากฏตามลำดับสองหรือสี่ครั้งหรือไม่ ฉันสามารถใช้ไวยากรณ์อะไรได้บ้าง?

\d{what goes here?}

ฉันพยายาม\d{2,4}แล้ว แต่นิพจน์นี้ยอมรับตัวเลขสามหลักเช่นกัน


1
ตัวอย่างเช่นเพื่อให้ตรงกับสองหรือสี่หลักปี
DavidRR

คุณต้องการให้ if string คือabc 123 xyzอะไร? มันควรจะตรงกันไหม12เพราะนั่นคือตัวเลขสองหลักตามลำดับ หรือไม่ควรเพราะ12เป็นส่วนหนึ่งของลำดับตัวเลขที่ใหญ่กว่า123ซึ่งไม่ยาว 2 หรือ 4? ถ้าให้เดาฉันคิดว่าคุณต้องการพฤติกรรมแบบหลัง แต่คำถามของคุณยังไม่ชัดเจน ตัวอย่างและ / หรือข้อกำหนดที่ชัดเจนขึ้นจะช่วยได้ คำถามเดียวกันสำหรับabc 12345 def... จะเกิดอะไรขึ้นที่นั่น?
Jean-François Corbett

คำตอบ:


148

ไม่มีไวยากรณ์เฉพาะสำหรับสิ่งนั้น แต่มีหลายวิธีที่จะทำ:

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two

1
โดยส่วนตัวแล้วคิดเฉพาะ\d{2}(?:\d{2})?วิธีแก้ปัญหาจากค้างคาวเท่านั้น - ความหลากหลายที่ดี - อันสุดท้ายโดยเฉพาะอย่างยิ่งดูเหมือนดีมากและปรับขนาดได้
Nightfirecat

3
+1 เพื่อคำนึงถึงลำดับที่จำเป็นเมื่อใช้การสลับเพื่อจับคู่ 4 หลักก่อนจากนั้นจึง 2 หลัก งานที่ดียังมีรูปแบบอื่น ๆ
Ahmad Mageed

9
สำหรับใครก็ตามที่เช่นฉันไม่เข้าใจการใช้(?:สิ่งนี้จะเริ่ม "กลุ่มที่ไม่จับภาพ" (กลุ่มที่ไม่ได้ตั้งใจให้อ้างอิงในคำสั่งแทนที่) คุณยังสามารถใช้ parens ได้ แต่สิ่งเหล่านี้จะสร้างกลุ่มการจับภาพ รายละเอียดเพิ่มเติมที่นี่: stackoverflow.com/questions/3512471/non-capturing-group
Jeremy Moritz

สิ่งเหล่านี้จะแสดงผลลัพธ์เดียวกันสำหรับ "333" และ "33"
Dan

1
@ แดน: regexes เหล่านี้ไม่ตรงกับสตริง"333"ทั้งหมด คุณอาจใช้ฟังก์ชัน "ค้นหาสตริงย่อยที่ตรงกัน" ของไลบรารี regex โดยไม่ได้ตั้งใจแทนที่จะเป็นฟังก์ชัน "ตรวจสอบว่าสตริงสมบูรณ์ตรงกัน" หรือไม่ คุณควรศึกษาเอกสารประกอบ
ruakh

3
(?<!\d)(\d{2}|\d{4})(?!\d)

นี่เป็นวิธีที่ถูกต้องในการทำ คำตอบที่ยอมรับนั้นผิด

มันจะตรงกับ 3 หลัก (หรือ 5) เพื่อให้เป็นที่ไม่ถูกต้องในสายตาของฉัน

1) ตรวจสอบว่าไม่มีตัวเลขก่อนลำดับ 2 หรือ 4 หลักหรือหลังลำดับสองหรือสี่หลัก

  • (<!) ไวยากรณ์เป็นลักษณะเชิงลบเบื้องหลัง

  • (?!) ไวยากรณ์เป็นผู้มองเชิงลบ

ข้างต้นจะใช้ได้กับสตริงกลาง:

ถ้าสตริงการค้นหาของคุณมีเนื้อหารอบ ๆ มันไม่มีคุณสามารถใช้^และ$เริ่มต้นและสิ้นสุดของจุดยึดสตริง:

^\d{4}$|^\d{2}$

1
ฉันจะไม่บอกว่าคำตอบที่ยอมรับนั้นผิด ฉันจะบอกว่าคำถามไม่ชัดเจนและคำตอบนั้นเป็นการตีความที่ถูกต้องหนึ่งข้อ คำตอบของคุณกล่าวถึงการตีความที่ถูกต้องอีกแบบหนึ่ง (ซึ่งฉันคิดว่าน่าจะเป็นไปได้มากกว่า - แต่ดูเหมือนว่าผู้ถามไม่ได้ ... )
Jean-François Corbett

2
"มันจะตรงกับ 3 หลัก" นั้นไม่ถูกต้องนัก ฉันคิดว่าคุณหมายถึง "มันจะจับคู่ลำดับ 2 หลักของลำดับ 3 หลัก"
Jean-François Corbett

1
นอกจากนี้คำตอบของคุณยังไม่ได้ผลตามที่ตั้งใจไว้ในลำดับตั้งแต่ 5 หลักขึ้นไป ฉันไม่ใช่ผู้เชี่ยวชาญด้าน regex แต่ฉันคิดว่าวิธีหนึ่งในการแก้ไขคือการทำให้การมองเชิงลบ / เบื้องหลังใช้กับทั้งสองกรณี (ลำดับ 2- และ 4 หลัก):(?<!\d)(\d{2}|\d{4})(?!\d)
Jean-François Corbett

ฉันคิดว่าคุณถูกต้องเกี่ยวกับตัวเลข 5 หลัก ขอบคุณสำหรับการแก้ไข จะแก้ไขที่.
JGFMK

^\d{4}$|^\d{2}$จะเป็นวิธีที่เป็นไปได้ในการแก้ไขปัญหานั้น ตามที่จะเป็น^\d{2}(?!\d)|^\d{4}(?!\d)
JGFMK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.