Perl : Regex (การซ้ำที่ตรงกัน)

ฉันมีคำถามด่วน ฉันทำอะไรผิดในโค้ดด้านล่าง:

#!/usr/bin/perl -w
use strict;
my $num = "12345";
print "$num \n" if $num =~ m/\d{1,3}/;

เนื่องจากตัวเลขของฉันมีความยาว 5 หลัก ฉันหวังว่าผลลัพธ์ไม่ควรพิมพ์อะไรเลย เพราะหากคำสั่งกำลังมองหาตัวเลขที่มีอย่างน้อย 1 หลักและสูงสุด 3 หลัก แต่สคริปต์ของฉันไพน์ผลลัพธ์ดังนี้:

# perl num.pl 
12345 

ฉันเข้าใจผิด regex ข้างต้นหรือไม่

ขอบคุณ.

แก้ไข:

ที่จริงแล้วฉันกำลังพยายามจับคู่ที่อยู่ IP เช่นสตริง เช่น. ฉันต้องการจับคู่ 11.222.3.444 แต่ใช้ไม่ได้กับ m/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/ ดังนั้นฉันจึงเริ่มทำงานกับสตริงเดียวที่มีเฉพาะตัวเลข และจากนั้นจึงโพสต์สิ่งนี้ลงในสแต็กโอเวอร์โฟลว์

หากฉันต้องใส่ ^ OR $ ฉันควรใช้งานมันอย่างไรหากฉันต้องการจับคู่ที่อยู่ IP เหมือนสตริงที่กล่าวไว้ข้างต้น

ขอบคุณสำหรับเวลาของคุณ


person slayedbylucifer    schedule 07.09.2012    source แหล่งที่มา
comment
คุณขาดจุดยึด ^ และ $   -  person flesk    schedule 07.09.2012
comment
สำหรับการจับคู่ที่อยู่ IP ให้ลองใช้ Regexp::Common: :สุทธิ.   -  person Kenosis    schedule 07.09.2012
comment
คุณลืมที่จะหลบหนี . ใช้ \.   -  person jchips12    schedule 07.09.2012


คำตอบ (2)


สิ่งที่โค้ด Perl ของคุณบอกคือ "ภายในสตริง $num คุณจะพบสตริงอย่างน้อย 1 ตัวอักษรและสูงสุด 3 ตัวอักษรที่สร้างจากตัวเลขเท่านั้น" คำตอบคือใช่

สิ่งที่คุณต้องการคือ

print "$num \n" if $num =~ m/^\d{1,3}$/;

ซึ่งหมายความว่า "ภายในสตริง $num เริ่มต้นที่อักขระตัวแรกและไปยังอักขระตัวสุดท้ายจะมีสตริงที่มีความยาวอย่างน้อย 1 อักขระและยาวสูงสุด 3 อักขระที่สร้างจากตัวเลขเท่านั้น"

หากคุณกำลังพยายามค้นหาบางอย่างเช่นที่อยู่ IP regexp เพื่อให้ตรงกับที่อยู่ IP เป็นการสนทนาที่ดี เกี่ยวกับวิธีการทำเช่นนั้น

person Michelle Six    schedule 07.09.2012
comment
ขอบคุณสำหรับเวลาของคุณมิเชลล์ คุณช่วยกรุณาอ่านการแก้ไขที่ฉันทำในโพสต์ต้นฉบับของฉันและแนะนำฉันตามนั้น ขอบคุณ. - person slayedbylucifer; 07.09.2012
comment
อันนี้ดูเหมือนว่าจะทำงานได้ดี: m/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/ - person slayedbylucifer; 07.09.2012

รหัสด้านล่างตรวจสอบที่อยู่ IP อย่างถูกต้อง การตรวจสอบความถูกต้องที่พิจารณามีดังต่อไปนี้ 1) หากความยาวของส่วนใดๆ ของที่อยู่ IP ที่คั่นด้วยทศนิยมมีมากกว่าหนึ่งหลัก ก็ไม่ควรเริ่มต้นด้วยศูนย์ 2) ที่อยู่ IP แรกที่คั่นด้วยทศนิยมไม่สามารถเป็นศูนย์ได้ 3) ส่วนใดส่วนหนึ่งของที่อยู่ IP ที่คั่นด้วยทศนิยมต้องไม่เกิน 255

ขอให้สมาชิกปรับแต่ง regex อย่างละเอียดเนื่องจากมันดูใหญ่เกินไปและสับสน

print "Enter the IP address : ";
$ip = <stdin>;
if($ip =~ /^([3-9]\d?|1\d?\d?|2([0-4]?\d?|5[0-5]|[6-9]?))(\.(0|[3-9]\d?|(1\d?\d?|2([0-4]?\d?|5[0-5]|[6-9]?)))){3}$/) {
    print "Correct\n";
}
else {
    print "Wrong\n";
}
person Kamleein    schedule 26.03.2014
comment
คุณลองแล้วหรือยัง? ซึ่งตรงกับ 9558.7506.5556.4545 เช่น - person Toto; 26.03.2014
comment
ใช่ ฉันลองแล้ว.... ด้านล่างนี้คือผลลัพธ์ที่ฉันได้รับขณะรันโค้ดด้วยค่าอินพุตของคุณ $ perl ip.pl ป้อนที่อยู่ IP : 9558.7506.5556.4545 ผิด - person Kamleein; 26.03.2014
comment
ใช่ คุณพูดถูกสำหรับอันนี้แต่มันตรวจสอบได้ 955.955.955.955 - person Toto; 26.03.2014
comment
สวัสดี M42 ขอบคุณสำหรับฟีดกลับของคุณ ฉันได้แก้ไข regex ด้านบนแล้ว ตอนนี้ดูเหมือนว่าจะดี ยินดีที่จะปรับปรุงหากได้รับความคิดเห็นเพิ่มเติม - person Kamleein; 26.03.2014
comment
regex ได้รับการแก้ไขแล้ว โปรดแจ้งให้เราทราบหากเป็นประโยชน์ ผู้เชี่ยวชาญโปรดตรวจสอบและแจ้งให้เราทราบว่าฉันจะทำให้เข้าใจมากขึ้นได้อย่างไร - person Kamleein; 26.03.2014
comment
@ M42 - ได้แก้ไข regex โดยอ้างอิงถึงลิงก์ที่ให้มาขอบคุณ ปัญหาเกี่ยวกับลิงก์ที่ให้มาคือที่อยู่ IP 1.1.1.01 ไม่ถูกต้อง แต่การจับคู่ในลิงก์นั้นสำเร็จแล้ว - person Kamleein; 26.03.2014