การตรวจสอบที่อยู่ IPv4 ด้วย regexp


94

ฉันพยายามรับ regex ที่มีประสิทธิภาพสำหรับการตรวจสอบความถูกต้อง IPv4 แต่ไม่มีโชคมากนัก ดูเหมือนว่ามีอยู่ช่วงหนึ่งที่ฉันมีมัน(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}แต่มันให้ผลลัพธ์ที่แปลกประหลาด:

$ grep --version
grep (GNU grep) 2.7
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.1
192.168.1.1
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.255
192.168.1.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.255.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.2555
192.168.1.2555

ฉันทำการค้นหาเพื่อดูว่าสิ่งนี้ถูกถามและตอบไปแล้วหรือไม่ แต่คำตอบอื่น ๆ ดูเหมือนจะแสดงให้เห็นว่าจะกำหนดตัวเลข 1-3 4 กลุ่มได้อย่างไรหรือไม่ได้ผลสำหรับฉัน


13
อย่าลืมว่า A และ AB และ ABC เป็นรูปแบบที่อยู่ IP ที่ถูกต้องเช่นเดียวกับ ABCD Seriously ลองping 2130706433และping 127.1หัวเราะคิกคัก
dty

1
ตัวแปรออนไลน์ของฉันregexr.com/39hqf
Sllouyssgort

คำตอบ:


98

คุณมีคำตอบที่ใช้งานได้แล้ว แต่ในกรณีที่คุณสงสัยว่ามีอะไรผิดปกติกับแนวทางเดิมของคุณคำตอบคือคุณต้องมีวงเล็บรอบตัวเลือกของคุณมิฉะนั้น(\.|$)จะต้องใช้ก็ต่อเมื่อจำนวนน้อยกว่า 200

'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b'
    ^                                    ^

26
สิ่งนี้ดูเหมือนจะตรวจสอบสิ่งต่างๆเช่น192.168.1.1.1
cwd

2
มันควรจะเป็น: \b((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:(?<!\.)\b|\.)){4}; กล่าวคือมันลงท้ายด้วยขอบเขตของคำแทนที่จะเป็นจุดสิ้นสุดของบรรทัด? นอกจากนี้ที่นี่ฉันได้ทำเครื่องหมายกลุ่มที่ไม่จับภาพเพื่อหลีกเลี่ยงการจับคู่ย่อยที่ไม่ต้องการ หมายเหตุ: สิ่งนี้ยังไม่ได้คำนึงถึงความคิดเห็นของ @ dty เนื่องจากฉันไม่คุ้นเคยกับรูปแบบของ IP นั้น แม้ว่าเขาจะถูกต้องและดูเหมือนว่าถูกต้อง
JohnLBevan

คุณอาจลองใช้วิธีนี้แทน: ((1? \ d \ d? | 2 [0-4] \ d | 25 [0-5]) \.) {3} (1? \ d \ d? | 2 [0-4] \ d | 25 [0-5])
มอร์ก

ใช้งานได้ดีสำหรับการไม่จับภาพ -\b(?:(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b
Appy

3
จะถูก09.09.09.09พิจารณาว่าเป็น IP ที่ถูกต้อง? regex นี้ยังจับคู่ได้ด้วย แต่ ping แสดงข้อความแสดงข้อผิดพลาดเช่นping: cannot resolve 09.09.09.09: Unknown host. ฉันคิดว่าอาจเป็นการดีที่จะลดการจับคู่ให้เป็นการจับคู่สัญกรณ์แบบจุด - ทศนิยมเท่านั้น รายการนี้กล่าวถึงข้อผิดพลาดสำคัญในที่อยู่ IP
Ruifeng Ma

82
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

ยอมรับ :

127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01        # This is an invalid IP address!

ปฏิเสธ :

30.168.1.255.1
127.1
192.168.1.256
-1.2.3.4
1.1.1.1.
3...3

ลองออนไลน์ด้วยการทดสอบหน่วย: https://www.debuggex.com/r/-EDZOqxTxhiTncN6/1


แล้วที่อยู่ไอพี "3 ... 3" ล่ะ 3 ... 3 ได้รับการยอมรับโดยใช้ regex นี้
Ankur Loriya

8
1.1.1.01 ล่ะ ถือว่าเป็นที่อยู่ IPv4 ที่ถูกต้องหรือไม่ ขอบคุณ.
odieatla

regexp 1.1.1.01 นี้ถือว่าเป็นที่อยู่ IPv4 ที่ถูกต้อง การทดสอบหน่วยออนไลน์debuggex.com/r/-EDZOqxTxhiTncN6/1
Sllouyssgort

โดยวิธีการ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}$รับผลลัพธ์เดียวกันdebuggex.com/r/mz_-0dEm3wseIKqKซึ่งค่อนข้างคล้ายกับคำตอบของ
@Mark

@PriteshAcharya ทำงานได้ดีที่นี่
Kid Diamond

41

เวอร์ชันใหม่ล่าสุดสั้นที่สุดและอ่านได้น้อยที่สุด ( 55 ตัวอักษร )

^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$

รุ่นนี้มองหาเคส 250-5 หลังจากนั้นอย่างชาญฉลาดหรือทุกกรณีที่เป็นไปได้สำหรับ200-249 100-199 10-99เคส สังเกตว่าชิ้น|)ส่วนนั้นไม่ใช่ข้อผิดพลาด แต่จริงๆแล้ว OR เป็นกรณีสุดท้ายสำหรับช่วง 0-9 ฉันยังละเว้น?:ส่วนของกลุ่มที่ไม่จับภาพเนื่องจากเราไม่สนใจเกี่ยวกับรายการที่จับได้จริงๆพวกเขาจะไม่ถูกจับทั้งสองทางหากเราไม่มีการจับคู่แบบเต็มตั้งแต่แรก

เวอร์ชันเก่าและสั้นกว่า (อ่านได้น้อยลง) ( 63 ตัวอักษร )

^(?:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(?!$)|$)){4}$

รุ่นเก่ากว่า (อ่านได้) ( 70 ตัวอักษร )

^(?:(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(\.(?!$)|$)){4}$

ใช้การมองหาเชิงลบ(?!)เพื่อลบกรณีที่ ip อาจลงท้ายด้วย.

คำตอบที่เก่าที่สุด ( 115 ตัวอักษร )

^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}
    (?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$

ฉันคิดว่านี่เป็น regex ที่ถูกต้องและเข้มงวดที่สุดมันไม่ยอมรับสิ่งที่000.021.01.0.ดูเหมือนว่าคำตอบอื่น ๆ ส่วนใหญ่ที่นี่ทำและต้องการ regex เพิ่มเติมเพื่อปฏิเสธกรณีที่คล้ายกับนั้นนั่นคือ0หมายเลขเริ่มต้นและ ip ที่ลงท้ายด้วย a.


นี่เป็นคำตอบเดียวที่ถูกต้องในชุดข้อความนี้จนถึงปัจจุบัน คนอื่น ๆ พลาดที่อยู่เช่น0.0.0.0หรือยอมรับสัญกรณ์ฐานแปด / ฐานสิบผสมเช่น033.033.33.033หรือแม้กระทั่งอนุญาต 999.999.999.999 regex ซึ่งสั้นกว่าคำตอบนี้ 10 ตัวอักษร:(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
ภาคผนวก

1
@tinmarino ฉันเปลี่ยนคืนการแก้ไขของคุณเพราะอนุญาตสิ่งต่างๆเช่น 192.168.000.1 ซึ่งไม่ใช่ที่อยู่ที่ถูกต้อง ใครก็ตามที่ต้องการแก้ไขคำตอบนี้โปรดแสดงความคิดเห็นก่อนเพื่อหลีกเลี่ยงปัญหาเหล่านี้ - ฉันมักจะตอบกลับค่อนข้างเร็ว มองหาทางออกที่สั้นกว่า / ดีกว่าอยู่เสมอ
Danail Gabenski

1
@DanailGabenski (และอื่น ๆ ) สำหรับหน่วยความจำคุณแก้ไขได้[01]?[0-9][0-9]?โดยแทนที่สุดท้ายด้วย1[0-9]{2}|[1-9]?[0-9]เพราะคุณไม่ชอบ0 นำหน้า ขอบคุณอีกครั้ง! ฉันจะเก็บวิธีแก้ปัญหาของคุณไว้ในกระเป๋าเดินทางหลักของ regex
Tinmarino

1
@tinmarino ใช่รูปแบบ dot-ทศนิยมที่ได้กลายเป็นมาตรฐานสำหรับ IPv4, ถึงแม้จะไม่ได้รับการยอมรับอย่างเป็นทางการโปรดดูที่ต่อไปนี้ โดยเฉพาะประเด็นที่ 3 ซึ่งมีการแนะนำร่างจดหมาย แต่หมดอายุแล้ว เหตุผลรองของการเข้มงวดกับการตรวจสอบความถูกต้องคือเมื่อนำเสนอใน UI IP ที่มีตัวเลขที่ไม่ใช่ทศนิยมเช่น 023 แทนที่จะเป็น 23 ทำให้ผู้ใช้คิดว่านี่เป็นข้อผิดพลาด / ข้อบกพร่อง นอกจากนี้ยังนำไปสู่ปัญหาในการตรวจสอบ / ความปลอดภัยเนื่องจาก 023 จำเป็นต้องแปลงเป็น 23 เพื่อหลีกเลี่ยงการซ้ำกันเป็นต้นขอบคุณที่พยายามทำให้สิ่งต่างๆดีขึ้น
Danail Gabenski

1
คุณสามารถทำให้มันสั้นลงโดยแฟออก[0-9]สำหรับ2[0-4], 1และกรณีที่สั้นกว่า ^(?:(25[0-5]|(?:2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$
Clayton Singh

11

ที่อยู่ IPv4 (การจับที่แม่นยำ) ตรงกับ 0.0.0.0 ถึง 255.255.255.255 แต่จับที่อยู่ที่ไม่ถูกต้องเช่น 1.1.000.1 ใช้ regex นี้เพื่อจับคู่หมายเลข IP ด้วยความแม่นยำ ตัวเลข 4 ตัวแต่ละตัวจะถูกจัดเก็บไว้ในกลุ่มการบันทึกเพื่อให้คุณสามารถเข้าถึงเพื่อประมวลผลต่อไปได้

\b
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
\b

นำมาจากห้องสมุด JGsoft RegexBuddy

แก้ไข: (\.|$)ส่วนนี้ดูแปลก ๆ


2
ดี! ฉันทำการปรับเปลี่ยนที่มีประสิทธิภาพมากขึ้นซึ่งดูเหมือนว่าจะได้ผล: "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$){4}\b- ขอบคุณ!
Matthieu Cartier

2
@MatthieuCartier รูปแบบ regex ที่มีประสิทธิภาพของคุณไม่ได้ผลสำหรับฉัน
R__raki__

1
255.255.255.000 ไม่ใช่ IP ที่ถูกต้อง
Stéphane GRILLON

6

ฉันกำลังค้นหาสิ่งที่คล้ายกันสำหรับที่อยู่ IPv4 - regex ที่หยุดการตรวจสอบที่อยู่ IP ส่วนตัวที่ใช้กันทั่วไปด้วย (192.168.xy, 10.xyz, 172.16.xy) ดังนั้นจึงใช้การมองเชิงลบล่วงหน้าเพื่อทำสิ่งนี้ให้สำเร็จ:

(?!(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.).*)
(?!255\.255\.255\.255)(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|[1-9])
(\.(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|\d)){3}

(สิ่งเหล่านี้ควรอยู่ในบรรทัดเดียวโดยจัดรูปแบบเพื่อจุดประสงค์ในการอ่าน 3 บรรทัดแยกกัน) การแสดงภาพนิพจน์ทั่วไป

การสาธิต Debuggex

อาจไม่ได้รับการปรับให้เหมาะสมกับความเร็ว แต่ทำงานได้ดีเมื่อมองหาที่อยู่อินเทอร์เน็ต "จริง" เท่านั้น

สิ่งที่จะ (และควร) ล้มเหลว:

0.1.2.3         (0.0.0.0/8 is reserved for some broadcasts)
10.1.2.3        (10.0.0.0/8 is considered private)
172.16.1.2      (172.16.0.0/12 is considered private)
172.31.1.2      (same as previous, but near the end of that range)
192.168.1.2     (192.168.0.0/16 is considered private)
255.255.255.255 (reserved broadcast is not an IP)
.2.3.4
1.2.3.
1.2.3.256
1.2.256.4
1.256.3.4
256.2.3.4
1.2.3.4.5
1..3.4

IP ที่จะ (และควร) ทำงาน:

1.0.1.0         (China)
8.8.8.8         (Google DNS in USA)
100.1.2.3       (USA)
172.15.1.2      (USA)
172.32.1.2      (USA)
192.167.1.2     (Italy)

ให้ไว้ในกรณีที่มีผู้อื่นกำลังมองหาการตรวจสอบ 'ที่อยู่ IP อินเทอร์เน็ตที่ไม่รวมที่อยู่ส่วนตัวทั่วไป'


5

ฉันคิดว่าหลายคนที่อ่านโพสต์นี้จะมองหานิพจน์ทั่วไปที่ง่ายกว่าแม้ว่าจะตรงกับที่อยู่ IP ที่ไม่ถูกต้องทางเทคนิคก็ตาม (และตามที่ระบุไว้ในที่อื่น regex อาจไม่ใช่เครื่องมือที่เหมาะสมในการตรวจสอบที่อยู่ IP อย่างถูกต้อง)

ลบ^และแทนที่$ด้วย\bหากคุณไม่ต้องการจับคู่จุดเริ่มต้น / จุดสิ้นสุดของบรรทัด

นิพจน์ทั่วไปพื้นฐาน (BRE) (ทดสอบกับ GNU grep, GNU sed และ vim):

/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/

นิพจน์ทั่วไปเพิ่มเติม (ERE):

/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/

หรือ:

/^([0-9]+(\.|$)){4}/

นิพจน์ทั่วไปที่เข้ากันได้กับ Perl (PCRE) (ทดสอบบน Perl 5.18):

/^\d+\.\d+\.\d+\.\d+$/

หรือ:

/^(\d+(\.|$)){4}/

Ruby (ทดสอบกับ Ruby 2.1):

แม้ว่าควรจะเป็น PCRE แต่ Ruby ไม่ว่าด้วยเหตุผลใดก็ตามที่อนุญาตให้ regex นี้ไม่ได้รับอนุญาตโดย Perl 5.18:

/^(\d+[\.$]){4}/

การทดสอบของฉันทั้งหมดเหล่านี้เป็นออนไลน์ที่นี่


3

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

^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$

3

คำตอบข้างต้นนั้นใช้ได้ แต่จะเกิดอะไรขึ้นถ้าที่อยู่ IP ไม่ได้อยู่ที่ท้ายบรรทัดและอยู่ระหว่างข้อความ .. regex นี้จะใช้งานได้

รหัส: '\b((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.)){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\b'

ไฟล์ข้อความอินพุต:

ip address 0.0.0.0 asfasf
 sad sa 255.255.255.255 cvjnzx
zxckjzbxk  999.999.999.999 jshbczxcbx
sjaasbfj 192.168.0.1 asdkjaksb
oyo 123241.24121.1234.3423 yo
yo 0000.0000.0000.0000 y
aw1a.21asd2.21ad.21d2
yo 254.254.254.254 y0
172.24.1.210 asfjas
200.200.200.200
000.000.000.000
007.08.09.210
010.10.30.110

ข้อความที่ส่งออก:

0.0.0.0
255.255.255.255
192.168.0.1
254.254.254.254
172.24.1.210
200.200.200.200

1
สิ่งนี้ถูกทำเครื่องหมายในแง่ลบจนกว่าฉันจะให้คะแนน ฉันพยายามทำสิ่งนี้มาตลอด (หลายชั่วโมงกว่าที่ฉันอยากจะยอมรับ) มันจะไม่จับเส้นที่มีจุดมากกว่าหนึ่งจุดบนเส้น แต่สำหรับกรณีการใช้งานของฉันฉันสามารถอยู่กับสิ่งนั้นได้ นี่คือคำตอบที่ยอดเยี่ยมต้องการคะแนนเสียงมากกว่านี้!
anastrophe

3

'' 'รหัสนี้ใช้ได้สำหรับฉันและก็ง่ายเหมือนกัน

ที่นี่ฉันได้รับค่าของ ip และฉันพยายามจับคู่กับ regex

ip="25.255.45.67"    

op=re.match('(\d+).(\d+).(\d+).(\d+)',ip)

if ((int(op.group(1))<=255) and (int(op.group(2))<=255) and int(op.group(3))<=255) and (int(op.group(4))<=255)):

print("valid ip")

else:

print("Not valid")

เงื่อนไขข้างต้นตรวจสอบว่าค่าเกิน 255 สำหรับออคเต็ต 4 ทั้งหมดหรือไม่แสดงว่าไม่ถูกต้อง แต่ก่อนที่จะใช้เงื่อนไขเราต้องแปลงเป็นจำนวนเต็มเนื่องจากค่าอยู่ในสตริง

กลุ่ม (0) พิมพ์ผลลัพธ์ที่ตรงกันในขณะที่กลุ่ม (1) พิมพ์ค่าที่ตรงกันแรกและที่นี่จะเป็น "25" และอื่น ๆ '' '


ยินดีต้อนรับสู่ StackOverflow หากคุณสามารถใช้คำว่าทำไมคำตอบของคุณควรแก้ปัญหา OP ได้ก็จะดีมาก โดยทั่วไปคำตอบที่ใช้รหัสเท่านั้นเป็นคำตอบที่ไม่ดีเนื่องจากไม่ได้ช่วยให้เพื่อนร่วมเขียนโค้ดเข้าใจสิ่งที่พวกเขาทำผิด
Davide Vitali

ใช้การเยื้องที่เหมาะสมในรหัสของคุณเพื่อให้ผู้ใช้สามารถอ่านได้
Syed Mehtab Hassan


2

สำหรับหมายเลขตั้งแต่ 0 ถึง 255 ฉันใช้นิพจน์นี้:

(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))

regex ด้านบนจะจับคู่หมายเลขจำนวนเต็มตั้งแต่ 0 ถึง 255 แต่ไม่ตรงกับ 256

ดังนั้นสำหรับ IPv4 ฉันใช้ regex นี้:

^(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})$

มันอยู่ในโครงสร้างนี้^(N)((\.(N)){3})$โดยที่ N คือ regex ที่ใช้ในการจับคู่หมายเลขตั้งแต่ 0 ถึง 255
regex นี้จะจับคู่ IP ดังต่อไปนี้:

0.0.0.0
192.168.1.2

แต่ไม่ใช่ด้านล่าง:

10.1.0.256
1.2.3.
127.0.1-2.3

สำหรับ IPv4 CIDR (Classless Inter-Domain Routing) ฉันใช้ regex นี้:

^(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})\/(([0-9])|([12][0-9])|(3[0-2]))$

มันอยู่ในโครงสร้างนี้^(N)((\.(N)){3})\/M$โดยที่ N คือ regex ที่ใช้ในการจับคู่หมายเลขตั้งแต่ 0 ถึง 255 และ M คือ regex ที่ใช้จับคู่หมายเลขตั้งแต่ 0 ถึง 32
regex นี้จะจับคู่ CIDR ดังต่อไปนี้:

0.0.0.0/0
192.168.1.2/32

แต่ไม่ใช่ด้านล่าง:

10.1.0.256/16
1.2.3./24
127.0.0.1/33

และสำหรับรายการ IPv4 CIDR เช่น"10.0.0.0/16", "192.168.1.1/32"ฉันใช้ regex นี้:

^("(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})\/(([0-9])|([12][0-9])|(3[0-2]))")((,([ ]*)("(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})\/(([0-9])|([12][0-9])|(3[0-2]))"))*)$

มันอยู่ในโครงสร้างนี้: ^(“C”)((,([ ]*)(“C”))*)$โดยที่ C คือ regex ที่ใช้จับคู่ CIDR (เช่น 0.0.0.0/0)
regex นี้จะตรงกับรายการ CIDR ดังต่อไปนี้:

“10.0.0.0/16”,”192.168.1.2/32”, “1.2.3.4/32”

แต่ไม่ใช่ด้านล่าง:

“10.0.0.0/16” 192.168.1.2/32 “1.2.3.4/32”

บางทีมันอาจจะสั้นลง แต่สำหรับฉันแล้วฉันก็เข้าใจได้ง่ายมาก

หวังว่าจะช่วยได้!


ยินดีต้อนรับสู่ SO เราขอขอบคุณข้อมูลของคุณ! คุณช่วยอธิบายให้ละเอียดได้ไหมว่า regex ต่างๆกำลังทำอะไรอยู่ (โดยเฉพาะอย่างยิ่งอันสุดท้าย)
B - rian

1

ฉันจัดการสร้างนิพจน์ทั่วไปจากคำตอบอื่น ๆ ทั้งหมด

(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)(\.(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)){3}

ตามมาตรฐานอีเธอร์เน็ต IEEE 802.x การตรวจสอบ IP คือช่วง IP 0.xxx >>> ไม่ควรได้รับอนุญาต - IP ไม่ถูกต้อง # 1 ช่วง IP เริ่มตั้งแต่ 1.xxx ถึง 126.xxx >>>> สามารถกำหนดค่าได้ # 2 ไม่ควรอนุญาตช่วง IP 127.xxx >>>> - IP ไม่ถูกต้อง # 3 ช่วง IP 128.xxx ถึง 223.xxx >> สามารถกำหนดค่าได้ แนะนำวิธีจัดการที่ดีกว่าดังนี้: ^ (22 [0-3] | 2 [0-1] [0-9] | [1] [0-9] [0-9]? | [1-9 ] [0-9] | [1-9]) \. (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]? ) \. (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \. (25 [0-4] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) $
Yogesh Aggarwal

1

ด้วยซับเน็ตมาสก์:

^$|([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\
.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\
.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\
.([01]?\\d\\d?|2[0-4]\\d|25[0-5])
((/([01]?\\d\\d?|2[0-4]\\d|25[0-5]))?)$

1
(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.){3}(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2})))

ทดสอบเพื่อค้นหารายการที่ตรงกันในข้อความ https://regex101.com/r/9CcMEN/2

ต่อไปนี้เป็นกฎที่กำหนดชุดค่าผสมที่ถูกต้องในแต่ละหมายเลขของที่อยู่ IP:

  • ตัวเลขหนึ่งหรือสองหลัก
  • ใด ๆ 1สามหลักเริ่มต้นด้วยจำนวน

  • ใด ๆ จำนวนสามหลักขึ้นต้นด้วย2ถ้าหลักที่สองคือผ่าน0 4

  • ใด ๆ จำนวนสามหลักขึ้นต้นด้วย25ถ้าหลักที่สามคือผ่าน0 5

เริ่มต้นด้วย(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.)ชุดของนิพจน์ย่อยที่ซ้อนกันสี่รายการและเราจะดูที่นิพจน์เหล่านี้ในลำดับย้อนกลับ (\d{1,2})ตรงกับหนึ่งหรือสองหลักจำนวนหรือตัวเลขผ่าน099(1\d{2})ตรงกับหมายเลขสามหลักขึ้นต้นด้วย1( 1ตามด้วยตัวเลขสองหลักใด ๆ ) หรือหมายเลขผ่าน100 ตรงกับตัวเลขผ่าน ตรงกับตัวเลขผ่าน นิพจน์ย่อยแต่ละนิพจน์เหล่านี้จะอยู่ภายในนิพจน์ย่อยอื่นโดยมีเครื่องหมายระหว่าง (เพื่อให้หนึ่งในสี่นิพจน์ย่อยต้องตรงกันไม่ใช่ทั้งหมด) หลังจากช่วงของตัวเลขมา199(2[0-4]\d)200249(25[0-5])250255|\.ตรงกัน.แล้วทั้งชุด (ตัวเลือกตัวเลขทั้งหมดบวก\.) ถูกปิดล้อมเข้าไปอีก subexpression {3}. สุดท้ายช่วงของตัวเลขจะถูกทำซ้ำ (คราวนี้ไม่มีการต่อท้าย\.) เพื่อให้ตรงกับหมายเลขที่อยู่ IP สุดท้าย ด้วยการ จำกัด ตัวเลขสี่ตัวให้มีค่าระหว่าง0และ255รูปแบบนี้สามารถจับคู่ที่อยู่ IP ที่ถูกต้องและปฏิเสธที่อยู่ที่ไม่ถูกต้องได้

ตัดตอนมาจาก: Ben Forta “ การเรียนรู้นิพจน์ทั่วไป”


หากไม่ต้องการอักขระที่จุดเริ่มต้นของที่อยู่ IP หรือตอนท้าย^และ$ควรใช้อักขระเมตาตามลำดับ

^(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.){3}(((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2})))$

ทดสอบเพื่อค้นหารายการที่ตรงกันในข้อความ https://regex101.com/r/uAP31A/1


1

ฉันพยายามทำให้มันง่ายขึ้นและสั้นลงเล็กน้อย

^(([01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}([01]?\d{1,2}|2[0-4]\d|25[0-5])$

หากคุณกำลังมองหา java / kotlin:

^(([01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d{1,2}|2[0-4]\\d|25[0-5])$

หากมีใครอยากรู้ว่ามันทำงานอย่างไรนี่คือคำอธิบาย มันง่ายมาก แค่ลองดู: p:

 1. ^.....$: '^' is the starting and '$' is the ending.

 2. (): These are called a group. You can think of like "if" condition groups.

 3. |: 'Or' condition - as same as most of the programming languages.

 4. [01]?\d{1,2}: '[01]' indicates one of the number between 0 and 1. '?' means '[01]' is optional. '\d' is for any digit between 0-9 and '{1,2}' indicates the length can be between 1 and 2. So here the number can be 0-199.

 5. 2[0-4]\d: '2' is just plain 2. '[0-4]' means a number between 0 to 4. '\d' is for any digit between 0-9. So here the number can be 200-249.

 6. 25[0-5]: '25' is just plain 25. '[0-5]' means a number between 0 to 5. So here the number can be 250-255.

 7. \.: It's just plan '.'(dot) for separating the numbers.

 8. {3}: It means the exact 3 repetition of the previous group inside '()'.

 9. ([01]?\d{1,2}|2[0-4]\d|25[0-5]): Totally same as point 2-6

ในทางคณิตศาสตร์มันเป็นเหมือน:

(0-199 OR 200-249 OR 250-255).{Repeat exactly 3 times}(0-199 OR 200-249 OR 250-255)

อย่างที่คุณเห็นตามปกตินี่คือรูปแบบของที่อยู่ IP ฉันหวังว่ามันจะช่วยให้เข้าใจนิพจน์ทั่วไปได้เล็กน้อย : p


1

ฉันพยายามทำให้มันง่ายขึ้นและสั้นลงเล็กน้อย

^ (([01]? \ d {1,2} | 2 [0-4] \ d | 25 [0-5])) {3} ([01]? \ d {1,2} | 2 [0-4] \ d | 25 [0-5]) $

หากคุณกำลังมองหา java / kotlin:

^ (([01]? \ d {1,2} | 2 [0-4] \ d | 25 [0-5]) \.) {3} ([01]? \ d {1,2} | 2 [0-4] \ d | 25 [0-5]) $

หากมีใครอยากรู้ว่ามันทำงานอย่างไรนี่คือคำอธิบาย มันง่ายมาก แค่ลองดู: p:

 1. ^.....$: '^' is the starting and '$' is the ending.

 2. (): These are called a group. You can think of like "if" condition groups.

 3. |: 'Or' condition - as same as most of the programming languages.

 4. [01]?\d{1,2}: '[01]' indicates one of the number between 0 and 1. '?' means '[01]' is optional. '\d' is for any digit between 0-9 and '{1,2}' indicates the length can be between 1 and 2. So here the number can be 0-199.

 5. 2[0-4]\d: '2' is just plain 2. '[0-4]' means a number between 0 to 4. '\d' is for any digit between 0-9. So here the number can be 200-249.

 6. 25[0-5]: '25' is just plain 25. '[0-5]' means a number between 0 to 5. So here the number can be 250-255.

 7. \.: It's just plan '.'(dot) for separating the numbers.

 8. {3}: It means the exact 3 repetition of the previous group inside '()'.

 9. ([01]?\d{1,2}|2[0-4]\d|25[0-5]): Totally same as point 2-6

ในทางคณิตศาสตร์มันเป็นเหมือน:

(0-199 OR 200-249 OR 250-255).{Repeat exactly 3 times}(0-199 OR 200-249 OR 250-255)

อย่างที่คุณเห็นตามปกตินี่คือรูปแบบของที่อยู่ IP ฉันหวังว่ามันจะช่วยให้เข้าใจนิพจน์ทั่วไปได้เล็กน้อย : p


0
    const char*ipv4_regexp = "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";

ฉันปรับนิพจน์ทั่วไปที่นำมาจากไลบรารี JGsoft RegexBuddy เป็นภาษา C (regcomp / regexec) และฉันพบว่ามันใช้งานได้ แต่มีปัญหาเล็กน้อยในบางระบบปฏิบัติการเช่น Linux นิพจน์ทั่วไปนั้นยอมรับที่อยู่ ipv4 เช่น 192.168.100.009 โดยที่ 009 ใน Linux ถือเป็นค่าฐานแปดดังนั้นที่อยู่จึงไม่ใช่ที่อยู่ที่คุณคิด ฉันเปลี่ยนนิพจน์ทั่วไปดังต่อไปนี้:

    const char* ipv4_regex = "\\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\b";

การใช้นิพจน์ทั่วไปนั้นตอนนี้ 192.168.100.009 ไม่ใช่ที่อยู่ ipv4 ที่ถูกต้องในขณะที่ 192.168.100.9 ก็โอเค

ฉันแก้ไขนิพจน์ทั่วไปสำหรับที่อยู่แบบหลายผู้รับด้วยและเป็นดังต่อไปนี้:

    const char* mcast_ipv4_regex = "\\b(22[4-9]|23[0-9])\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]?)\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\b";

ฉันคิดว่าคุณต้องปรับนิพจน์ทั่วไปให้เข้ากับภาษาที่คุณใช้เพื่อพัฒนาแอปพลิเคชันของคุณ

ฉันใส่ตัวอย่างใน java:

    package utility;

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class NetworkUtility {

        private static String ipv4RegExp = "\\b(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d?)\\b";

        private static String ipv4MulticastRegExp = "2(?:2[4-9]|3\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d?|0)){3}";

        public NetworkUtility() {

        }

        public static boolean isIpv4Address(String address) {
            Pattern pattern = Pattern.compile(ipv4RegExp);
            Matcher matcher = pattern.matcher(address);

            return matcher.matches();
        }

        public static boolean isIpv4MulticastAddress(String address) {
             Pattern pattern = Pattern.compile(ipv4MulticastRegExp);
             Matcher matcher = pattern.matcher(address);

             return matcher.matches();
        }
    }

0
-bash-3.2$ echo "191.191.191.39" | egrep 
  '(^|[^0-9])((2([6-9]|5[0-5]?|[0-4][0-9]?)?|1([0-9][0-9]?)?|[3-9][0-9]?|0)\.{3}
     (2([6-9]|5[0-5]?|[0-4][0-9]?)?|1([0-9][0-9]?)?|[3-9][0-9]?|0)($|[^0-9])'

>> 191.191.191.39

(นี่คือ DFA ที่ตรงกับพื้นที่ addr ทั้งหมด (รวมถึงการแพร่ภาพ ฯลฯ ) อย่างอื่น



0

ฉันพบว่าตัวอย่างนี้มีประโยชน์มากนอกจากนี้ยังอนุญาตให้ใช้สัญลักษณ์ ipv4 ที่แตกต่าง

โค้ดตัวอย่างโดยใช้ python:

    def is_valid_ipv4(ip4):
    """Validates IPv4 addresses.
    """
    import re
    pattern = re.compile(r"""
        ^
        (?:
          # Dotted variants:
          (?:
            # Decimal 1-255 (no leading 0's)
            [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
          |
            0x0*[0-9a-f]{1,2}  # Hexadecimal 0x0 - 0xFF (possible leading 0's)
          |
            0+[1-3]?[0-7]{0,2} # Octal 0 - 0377 (possible leading 0's)
          )
          (?:                  # Repeat 0-3 times, separated by a dot
            \.
            (?:
              [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
            |
              0x0*[0-9a-f]{1,2}
            |
              0+[1-3]?[0-7]{0,2}
            )
          ){0,3}
        |
          0x0*[0-9a-f]{1,8}    # Hexadecimal notation, 0x0 - 0xffffffff
        |
          0+[0-3]?[0-7]{0,10}  # Octal notation, 0 - 037777777777
        |
          # Decimal notation, 1-4294967295:
          429496729[0-5]|42949672[0-8]\d|4294967[01]\d\d|429496[0-6]\d{3}|
          42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|
          4[01]\d{8}|[1-3]\d{0,9}|[4-9]\d{0,8}
        )
        $
    """, re.VERBOSE | re.IGNORECASE)
    return pattern.match(ip4) <> None

0
((\.|^)(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0$)){4}

regex นี้จะไม่ยอมรับ 08.8.8.8 หรือ 8.08.8.8 หรือ 8.8.08.8 หรือ 8.8.8.08


อันนี้พลาดเช่น 127.0.0.1 และ 0.0.0.0
ผนวก

^ ((\. | ^) (25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0-9] | [1-9] [0-9] ? | [0-9]? | 0)) ((\. | ^) (25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0-9] | [1-9] [0-9]? | 0)) {2}. ((25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0- 9] | [1-9] [0-9]? | 0) $)
sudistack

1
ถูกต้องที่จะปฏิเสธเลขศูนย์นำหน้าตามข้อกำหนด
John Haugeland

0

ค้นหาที่อยู่ IP ที่ถูกต้องตราบใดที่ IP นั้นพันรอบอักขระใด ๆ ที่ไม่ใช่ตัวเลข (อยู่ข้างหลังหรือข้างหน้า IP) 4 Backreferences ที่สร้าง: $ + {first}. $ + {second}. $ + {third}. $ + {four}

Find String:
#any valid IP address
(?<IP>(?<![\d])(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))
#only valid private IP address RFC1918
(?<IP>(?<![\d])(:?(:?(?<first>10)[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5])))|(:?(?<first>172)[\.](?<second>(:?1[6-9])|(:?2[0-9])|(:?3[0-1])))|(:?(?<first>192)[\.](?<second>168)))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))

Notepad++ Replace String Option 1: Replaces the whole IP (NO Change):
$+{IP}

Notepad++ Replace String Option 2: Replaces the whole IP octect by octect (NO Change)
$+{first}.$+{second}.$+{third}.$+{forth}

Notepad++ Replace String Option 3: Replaces the whole IP octect by octect (replace 3rd octect value with 0)
$+{first}.$+{second}.0.$+{forth}
NOTE: The above will match any valid IP including 255.255.255.255 for example and change it to 255.255.0.255 which is wrong and not very useful of course.

การแทนที่ส่วนของแต่ละ octect ด้วยค่าจริง แต่คุณสามารถสร้างการค้นหาของคุณเองและแทนที่ซึ่งเป็นประโยชน์จริงในการแก้ไข IP ในไฟล์ข้อความ:

for example replace the first octect group of the original Find regex above:
(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))
with
(?<first>10)

and
(?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))
with
(?<second>216)
and you are now matching addresses starting with first octect 192 only

Find on notepad++:
(?<IP>(?<![\d])(?<first>10)[\.](?<second>216)[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))

คุณยังคงสามารถทำการแทนที่โดยใช้กลุ่มผู้ตัดสินย้อนกลับได้ในรูปแบบเดิมทุกประการ

คุณสามารถทราบได้ว่าข้อมูลข้างต้นตรงกับด้านล่างอย่างไร:

cat ipv4_validation_test.txt
Full Match:
0.0.0.1
12.108.1.34
192.168.1.1
10.249.24.212
10.216.1.212
192.168.1.255
255.255.255.255
0.0.0.0


Partial Match (IP Extraction from line)
30.168.1.0.1
-1.2.3.4
sfds10.216.24.23kgfd
da11.15.112.255adfdsfds
sfds10.216.24.23kgfd


NO Match
1.1.1.01
3...3
127.1.
192.168.1..
192.168.1.256
da11.15.112.2554adfdsfds
da311.15.112.255adfdsfds

การใช้ grep คุณสามารถดูผลลัพธ์ด้านล่าง:

From grep:
grep -oP '(?<IP>(?<![\d])(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))' ipv4_validation_test.txt
0.0.0.1
12.108.1.34
192.168.1.1
10.249.24.212
10.216.1.212
192.168.1.255
255.255.255.255
0.0.0.0
30.168.1.0
1.2.3.4
10.216.24.23
11.15.112.255
10.216.24.23


grep -P '(?<IP>(?<![\d])(?<first>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<second>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))' ipv4_validation_test.txt
0.0.0.1
12.108.1.34
192.168.1.1
10.249.24.212
10.216.1.212
192.168.1.255
255.255.255.255
0.0.0.0
30.168.1.0.1
-1.2.3.4
sfds10.216.24.23kgfd
da11.15.112.255adfdsfds
sfds10.216.24.23kgfd


#matching ip addresses starting with 10.216
grep -oP '(?<IP>(?<![\d])(?<first>10)[\.](?<second>216)[\.](?<third>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))[\.](?<forth>(:?\d)|(:?[1-9]\d)|(:?1\d{2})|(:?2[0-4]\d)|(:?25[0-5]))(?![\d]))' ipv4_validation_test.txt
10.216.1.212
10.216.24.23
10.216.24.23

0

ที่อยู่ IPv4 เป็นสิ่งที่ซับซ้อนมาก

หมายเหตุ : การเยื้องและซับในใช้เพื่อจุดประสงค์ในการอธิบายเท่านั้นและไม่มีอยู่ใน RegEx จริง

\b(
  ((
    (2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])
  |
    0[Xx]0*[0-9A-Fa-f]{1,2}
  |
    0+[1-3]?[0-9]{1,2}
  )\.){1,3}
  (
    (2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])
  |
    0[Xx]0*[0-9A-Fa-f]{1,2}
  |
    0+[1-3]?[0-9]{1,2}
  )
|
  (
    [1-3][0-9]{1,9}
  |
    [1-9][0-9]{,8}
  |
    (4([0-1][0-9]{8}
      |2([0-8][0-9]{7}
        |9([0-3][0-9]{6}
          |4([0-8][0-9]{5}
            |9([0-5][0-9]{4}
              |6([0-6][0-9]{3}
                |7([0-1][0-9]{2}
                  |2([0-8][0-9]{1}
                    |9([0-5]
    ))))))))))
  )
|
  0[Xx]0*[0-9A-Fa-f]{1,8}
|
  0+[1-3]?[0-7]{,10}
)\b

ที่อยู่ IPv4 เหล่านี้ได้รับการตรวจสอบความถูกต้องโดย RegEx ข้างต้น

127.0.0.1
2130706433
0x7F000001
017700000001
0x7F.0.0.01 # Mixed hex/dec/oct
000000000017700000001 # Have as many leading zeros as you want
0x0000000000007F000001 # Same as above
127.1
127.0.1

สิ่งเหล่านี้ถูกปฏิเสธ

256.0.0.1
192.168.1.099 # 099 is not a valid number
4294967296 # UINT32_MAX + 1
0x100000000
020000000000

0

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.)){3}+((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$


ด้านบนจะเป็น regex สำหรับที่อยู่ ip เช่น 221.234.000.112 สำหรับ 221.234.0.112, 221.24.03.112, 221.234.0.1


คุณสามารถจินตนาการถึงที่อยู่ทุกประเภทดังกล่าวข้างต้น


0

ฉันจะใช้ PCRE และdefineคำสำคัญ:

/^
 ((?&byte))\.((?&byte))\.((?&byte))\.((?&byte))$
 (?(DEFINE)
     (?<byte>25[0-5]|2[0-4]\d|[01]?\d\d?))
/gmx

การสาธิต: https://regex101.com/r/IB7j48/2

เหตุผลนี้คือหลีกเลี่ยงการทำซ้ำ(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)รูปแบบสี่ครั้ง โซลูชันอื่น ๆ เช่นวิธีการด้านล่างทำงานได้ดี แต่ไม่ได้จับแต่ละกลุ่มตามที่หลาย ๆ คนร้องขอ

/^((\d+?)(\.|$)){4}/ 

วิธีเดียวที่จะมีกลุ่มการจับภาพ 4 กลุ่มคือการทำซ้ำรูปแบบสี่ครั้ง:

/^(?<one>\d+)\.(?<two>\d+)\.(?<three>\d+)\.(?<four>\d+)$/

การจับ ipv4 ใน perl จึงทำได้ง่ายมาก

$ echo "Hey this is my IP address 138.131.254.8, bye!" | \
  perl -ne 'print "[$1, $2, $3, $4]" if \
    /\b((?&byte))\.((?&byte))\.((?&byte))\.((?&byte))
     (?(DEFINE)
        \b(?<byte>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
    /x'

[138, 131, 254, 8]

0

regexp IPv4 ที่แม่นยำตรงไปตรงมาและกะทัดรัดที่สุดที่ฉันสามารถจินตนาการได้คือ

^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$

แต่ประสิทธิภาพ / ประสิทธิภาพของ ... ขออภัยฉันไม่รู้ใครสนใจ?


0

ลองสิ่งนี้:

\b(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\.(2[0-5][0-5]|1[0-9][0-9]|[1-9][0-9]|[1-9]))\b

0
ip address can be from 0.0.0.0 to 255.255.255.255

(((0|1)?[0-9][0-9]?|2[0-4][0-9]|25[0-5])[.]){3}((0|1)?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$

(0|1)?[0-9][0-9]? - checking value from 0 to 199
2[0-4][0-9]- checking value from 200 to 249
25[0-5]- checking value from 250 to 255
[.] --> represent verify . character 
{3} --> will match exactly 3
$ --> end of string

0

ต่อไปนี้เป็นนิพจน์ regex เพื่อตรวจสอบความถูกต้องของที่อยู่ IP

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

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