Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ตรวจสอบที่อยู่ IPv4 โดยใช้รูปแบบ ReGex ใน C++


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

ที่อยู่ IPv4 ที่ถูกต้องคือ IP ในรูปแบบ "X1.X2.X3.X4" โดยที่ 0 <=Xi <=255 และ Xi ไม่สามารถมีศูนย์นำหน้าได้ ตัวอย่างเช่น "192.168.1.1" และ "192.168.1.0" เป็นที่อยู่ IPv4 ที่ถูกต้อง แต่ "192.168.01.1" ในขณะที่ "192.168.1.00" และ "192.168@1.1" เป็นที่อยู่ IPv4 ที่ไม่ถูกต้อง ตัวอย่างเช่น

อินพุต-1

IP= “172.15.254.2”

ผลผลิต

“IPv4”

คำอธิบาย − นี่คือที่อยู่ IPv4 ที่ถูกต้อง ส่งคืน “IPv4”

อินพุต-2

IP= “312.25.12.1”

ผลผลิต

“Not”

คำอธิบาย − นี่ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง ให้ส่งคืน "No"

แนวทางการแก้ปัญหานี้

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

ข้อกำหนดช่วง − เราสามารถระบุตัวอักษรเพื่อสร้างรูปแบบในวิธีที่ง่ายที่สุด ในการระบุช่วงโดยใช้อักขระ เราสามารถใช้วงเล็บ '[ ]'

การระบุตัวละคร − นิพจน์ด้านบนระบุวงเล็บเปิดและตัวเลขในช่วง a ถึง z , 'A' ถึง 'Z' และ '0' ถึง '9' เป็นนิพจน์ทั่วไป [a-z], [A-Z] และ [0-9].

รูปแบบซ้ำ − ตัวแก้ไขนิพจน์อาจเป็น "+" ที่แนะนำให้จับคู่การเกิดขึ้นของรูปแบบอย่างน้อยหนึ่งครั้ง หรืออาจเป็น "*" ที่แนะนำให้จับคู่การเกิดขึ้นของรูปแบบเป็นศูนย์หรือมากกว่าครั้ง

นิพจน์ [a-z]* จะจับคู่กับสตริงว่าง

หากคุณต้องการระบุกลุ่มอักขระให้ตรงกันหนึ่งครั้งหรือมากกว่านั้น คุณสามารถใช้วงเล็บดังต่อไปนี้ −

[Abc]+

ต่อไปนี้เป็นแนวทางในการแก้ปัญหานี้

  • รับอินพุตสตริงที่ระบุที่อยู่ IP

  • ฟังก์ชันสตริง validIPAddress(string IP) รับที่อยู่ IP เป็นอินพุตและตรวจสอบว่าสตริงอินพุตถูกต้องหรือไม่ หากถูกต้อง ให้ส่งคืน “IPv4” มิฉะนั้น ให้ส่งคืน “Not an IP Address”

  • การสร้างรูปแบบ regex สำหรับที่อยู่ IPv4 เนื่องจากที่อยู่ IPv4 มี 4 ช่อง โดยแต่ละช่องมีค่าอยู่ในช่วง 0-255 ที่อยู่ IPv4 ดูเหมือน XXX.XXX.XXX.XXX

  • ที่อยู่ IPv4 ที่ถูกต้องอาจอยู่ในช่วง (([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

  • ในทำนองเดียวกัน สำหรับฟิลด์ที่สอง อักขระตัวแรกจะอยู่ในช่วง 100-199 ดังนั้นรูปแบบ regex จะเป็น '1[0-9]-0-9]'

  • สำหรับช่องถัดไป ตัวเลขจะอยู่ในช่วง 200-249 ดังนั้นรูปแบบ regex จะเป็น '2[0-4][0-9]' ซึ่งทำให้มั่นใจได้ว่าช่วงจะไม่เกินตัวเลขที่มากกว่า 255

  • สุดท้ายซึ่งเป็นฟิลด์ถัดไปมีตัวเลขในช่วง 250-255 ดังนั้นรูปแบบ regex จะเป็น 25[0-5]

ตัวอย่าง

#include<bits/stdc++.h>
using namespace std;
string validIPAddress(string IP) {
   regex ipv4("(([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])");
   if(regex_match(IP, ipv4))
      return "IPv4";
   else
      return "Not";
}
int main(){
   string IP= “172.16.254.1”;
   string ans= validIPAddress(IP);
   cout<<ans<<endl;
   return 0;
}

ผลลัพธ์

การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น

IPv4

เนื่องจากที่อยู่ IP ที่ป้อนเป็นที่อยู่ IP ที่ถูกต้อง เราจะส่งคืน “IPv4”