ตรวจสอบว่าสตริงมีสตริงย่อยหรือไม่


113

ฉันจะตรวจสอบได้อย่างไรว่าสตริงที่ระบุมีสตริงย่อยโดยใช้ Perl หรือไม่

โดยเฉพาะอย่างยิ่งฉันต้องการดูว่าs1.domain.comมีอยู่ในตัวแปรสตริงที่กำหนดหรือไม่

คำตอบ:


232

หากต้องการทราบว่าสตริงมีสตริงย่อยหรือไม่คุณสามารถใช้indexฟังก์ชัน:

if (index($str, $substr) != -1) {
    print "$str contains $substr\n";
} 

มันจะส่งคืนตำแหน่งของการเกิดครั้งแรกของ$substrin $strหรือ -1 หากไม่พบสตริงย่อย


6
วิธีนี้เป็นวิธีที่ดีกว่าเมื่อคุณค้นหาโดยใช้ตัวแปร - วิธีนี้คุณจะไม่ต้องใช้อักขระ Escape คู่ (ในสตริงตัวแปรนี้) ซึ่งเป็นวิธีพิเศษสำหรับนิพจน์ทั่วไป (เช่น:)
evgeny9

57

ความเป็นไปได้อีกประการหนึ่งคือการใช้นิพจน์ทั่วไปซึ่งเป็นสิ่งที่ Perl มีชื่อเสียง:

if ($mystring =~ /s1\.domain\.com/) {
   print qq("$mystring" contains "s1.domain.com"\n);
}

จำเป็นต้องใช้แบ็กสแลชเนื่องจาก.สามารถจับคู่อักขระใดก็ได้ คุณสามารถแก้ไขปัญหานี้ได้โดยใช้ตัวดำเนินการ\Qและ\E

my $substring = "s1.domain.com";
    if ($mystring =~ /\Q$substring\E/) {
   print qq("$mystring" contains "$substring"\n);
}

หรือคุณสามารถทำตามที่ยูจีนปีที่ระบุไว้และใช้ดัชนีฟังก์ชั่น เพียงแค่คำเตือน: ดัชนีส่งกลับ-1เมื่อไม่สามารถพบการแข่งขันแทนหรือundef0

ดังนั้นนี่คือข้อผิดพลาด:

my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
    print qq("$mystring" doesn't contains "$substring"\n";
} 

สิ่งนี้จะผิดหากs1.domain.comอยู่ที่จุดเริ่มต้นของสตริงของคุณ ฉันเองถูกไฟไหม้มากกว่าหนึ่งครั้ง


ฉันคิดว่าindex()เร็วกว่า regexps ในกรณีง่ายๆ?
G. Cito

1
พยายามตอบ Perl เพื่อสอบถามเกี่ยวกับการลบสตริง - ฉันไม่ได้เปรียบเทียบความเร็ว แต่=~, index(), ~~และmatch::simpleทั้งหมดดูเหมือนบิตawk-ward ... : - \
กรัม Cito

คุณต้องตรวจสอบให้แน่ใจด้วยว่าสตริงที่คุณกำลังเปรียบเทียบนั้นไม่คำนึงถึงขนาดตัวพิมพ์ S1.DOMAIN.COM จะไม่ทำงานกับสตริงย่อย แต่ถ้าคุณ lc ($ givendomain) แล้วเปรียบเทียบกับ "s1.domain.com" ก็จะได้ผล นอกจากนี้สตริงย่อยไม่จำเป็นต้องเป็นแนวทางที่ถูกต้อง - ดูบันทึกของฉันด้านบนเพื่อตอบสนองของ eugene y
BlueChips23

@David W. อย่างไรก็ตามฉันไม่สามารถdomain.comจับคู่subdomain.domain.comโดยใช้ REGEX ด้านบนได้มีความคิดอย่างไร?
avrono

14

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

นี่คือส่วนขยายของคำตอบของ Eugene ซึ่งจะแปลงสตริงเป็นตัวพิมพ์เล็กก่อนที่จะตรวจสอบสตริงย่อย:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
} 

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