นิพจน์ทั่วไปสำหรับเลขฐานสิบหก?


114

ฉันจะสร้างนิพจน์ทั่วไปที่ตรวจพบเลขฐานสิบหกในข้อความได้อย่างไร

ตัวอย่างเช่น '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3' และ '8BADF00D'


1
Regex ไม่ได้แยกวิเคราะห์จริงๆ ลองแยกสิ่งที่เหมือนตัวเลขทั้งหมดและกรองสิ่งที่ไม่ใช่เลขฐานสิบหกออก
Blender

คำตอบ:


195

ต่อไปนี้เป็นอย่างไร?

0[xX][0-9a-fA-F]+

จับคู่นิพจน์ที่เริ่มต้นด้วย 0 ตามด้วย x ต่ำกว่าหรือตัวพิมพ์ใหญ่ตามด้วยอักขระหนึ่งตัวขึ้นไปในช่วง 0-9 หรือ af หรือ AF


35
ซึ่งอาจทำให้สั้นลง/0x[\da-f]/iได้ แต่อย่างอื่นคือ +1
Niklas B.

20
@NiklasB. การจดชวเลขของคุณจะใช้ได้ก็ต่อเมื่อใช้ perl regex หากใช้ POSIX regex วิธีแก้ปัญหาของ Steven จะสั้นที่สุด ไม่ว่าจะด้วยวิธีใดก็ตามโซลูชันของ Steven ใช้ได้กับทั้ง perl และ POSIX regex
David M.Syzdek

รับทราบ! วิธีแก้ไขโดย Steven นั้นดีถ้าเลขฐานสิบหกขึ้นต้นด้วย 0x หรือ 0X อันนี้น่าจะทำงานได้ดีกว่า: ^ [0-9A-F] + $ มันยังสามารถจดจำรูปแบบฐานสิบหกเช่น '535GH0G73' สำหรับ Java เราสามารถใช้เช่น String.matches () เพื่อตรวจสอบสิ่งนี้ .. ขอบคุณสำหรับการตอบกลับ :)
saurcery

2
"0x [\ da-f] {2}" ดีกว่าที่จะ จำกัด จำนวนด้วย
Yazan Rawashdeh

2
จะตรงกับตัวเลขตัวอย่างที่สองและสาม 0acdadecf822eeff32aca5830e438cb54aa722e3 และ 8BADF00D หรือไม่
Peter Mortensen

45

ไวยากรณ์ที่แน่นอนขึ้นอยู่กับข้อกำหนดและภาษาโปรแกรมของคุณ แต่โดยพื้นฐานแล้ว:

/[0-9a-fA-F]+/

หรือมากกว่านั้นiทำให้ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่

/[0-9a-f]+/i

หากคุณโชคดีพอที่จะใช้ Ruby คุณสามารถทำได้:

/\h+/

แก้ไข - คำตอบของ Steven Schroeder ทำให้ฉันรู้ว่าฉันเข้าใจบิต 0x ผิดดังนั้นฉันจึงอัปเดตคำแนะนำตามนั้น หากคุณต้องการจับคู่ 0x ด้วยสิ่งที่เทียบเท่าคือ

/0[xX][0-9a-fA-F]+/
/0x[0-9a-f]+/i
/0x[\h]+/i

เพิ่มมากขึ้น - หากต้องการ 0x เป็นทางเลือก (ตามที่คำถามมีนัย):

/(0x)?[0-9a-f]+/i

คุณช่วยอธิบายเหตุผลของ RE ข้างบนได้ไหม
saurcery

4
@noobDroid คุณต้องการให้ฉันอธิบายอะไรเป็นพิเศษ?
SimonMayer

18

ไม่ใช่เรื่องใหญ่ แต่เอ็นจิ้น regex ส่วนใหญ่รองรับคลาสอักขระ POSIX และมี[:xdigit:]สำหรับการจับคู่อักขระเลขฐานสิบหกซึ่งง่ายกว่า0-9a-fA-Fสิ่งทั่วไป

ดังนั้น regex ตามที่ร้องขอ (เช่นกับทางเลือก0x) คือ:/(0x)?[[:xdigit:]]+/


12

เป็นที่น่าสังเกตว่าการตรวจจับ MD5 (ซึ่งเป็นหนึ่งในตัวอย่าง) สามารถทำได้ด้วย:

[0-9a-fA-F]{32}



3

สำหรับบันทึกฉันจะระบุสิ่งต่อไปนี้:

/^[xX]?[0-9a-fA-F]{6}$/

ซึ่งแตกต่างในการที่จะตรวจสอบว่ามันมีจะมีหกตัวอักษรที่ถูกต้องและตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ x ในกรณีที่เรามีหนึ่ง


2

หากคุณกำลังมองหาอักขระเลขฐานสิบหกที่เฉพาะเจาะจงตรงกลางสตริงคุณสามารถใช้ "\ xhh" โดยที่ hh คืออักขระในเลขฐานสิบหก ฉันได้ลองและได้ผล ฉันใช้ framework สำหรับ C ++ Qt แต่มันสามารถแก้ปัญหาได้ในกรณีอื่น ๆ ขึ้นอยู่กับรสชาติที่คุณต้องการใช้ (php, javascript, python, golang ฯลฯ )

คำตอบนี้นำมาจาก: http://ult-tex.net/info/perl/


เฮ้! แม้ว่าสิ่งนี้อาจเป็นจริงสำหรับ perl แต่ดูเหมือนว่าจะไม่ใช่กรณีสำหรับ Regular Expressions ในภาษาโปรแกรมทั้งหมด ตามนี้ \xจะเทียบเท่ากับ\uในภาษาอื่น ๆ
Maurice

"especific anda" คืออะไร?
Peter Mortensen


1

อีกตัวอย่างหนึ่ง: ค่าเลขฐานสิบหกสำหรับสี css เริ่มต้นด้วยเครื่องหมายปอนด์หรือแฮช (#) ตามด้วยอักขระหกตัวที่อาจเป็นตัวเลขหรือตัวอักษรระหว่าง A และ F ได้

^#[0-9a-fA-F]{6}

0

ในกรณีที่คุณต้องการสิ่งนี้ภายในอินพุตที่ผู้ใช้สามารถพิมพ์0และ0xเช่นกัน แต่ไม่ใช่เลขฐานสิบหกที่ไม่มี0xคำนำหน้า:

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