วิธีตรวจสอบว่า String เริ่มต้นด้วย (คำนำหน้า) หรือลงท้ายด้วย (ต่อท้าย) ใน Swift


103

ฉันกำลังพยายามทดสอบว่าสตริง Swift เริ่มต้นหรือสิ้นสุดด้วยค่าที่แน่นอน ไม่มีวิธีการเหล่านี้:

var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error

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

มีวิธีที่ง่ายกว่านี้ไหม

(ฉันสะดุดกับคำตอบเมื่อฉันอ่านเอกสารประกอบและเนื่องจากคำตอบ SO ไม่ปรากฏขึ้นสำหรับข้อความค้นหาของฉันฉันจึงเพิ่มคำถาม & คำตอบที่นี่)

คำตอบ:


209

อัปเดตสำหรับ Swift 4

การตรวจสอบว่า String เริ่มต้นด้วยและลงท้ายด้วยอะไร

คุณสามารถใช้hasPrefix(_:)และhasSuffix(_:)วิธีการเพื่อทดสอบความเท่าเทียมกับสตริงอื่น

let str = "Hello, playground"

if str.hasPrefix("Hello") { // true
    print("Prefix exists")
}

if str.hasSuffix("ground") { // true
    print("Suffix exists")
}

รับค่าคำนำหน้าและคำต่อท้ายจริง

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

let str = "Hello, playground"

วิธีที่ 1: (แนะนำ) prefix(Int)และsuffix(Int)

let prefix = String(str.prefix(5)) // Hello
let suffix = String(str.suffix(6)) // ground

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

let prefix = String(str.prefix(225)) // Hello, playground
let suffix = String(str.suffix(623)) // Hello, playground

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

วิธีที่ 2: prefix(upto:)และsuffix(from:)

ดัชนี Swift String นั้นยุ่งยากเพราะต้องคำนึงถึงอักขระพิเศษ (เช่นอิโมจิ) อย่างไรก็ตามเมื่อคุณได้รับดัชนีแล้วคุณสามารถรับคำนำหน้าหรือคำต่อท้ายได้อย่างง่ายดาย (โปรดดูคำตอบอื่น ๆ ของฉันบนString.Index.)

let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str.prefix(upTo: prefixIndex)) // Hello

let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str.suffix(from: suffixIndex)) // ground

หากคุณต้องการป้องกันการออกนอกขอบเขตคุณสามารถสร้างดัชนีโดยใช้limitedBy(ดูคำตอบนี้อีกครั้ง)

วิธีที่ 3: ตัวห้อย

เนื่องจาก String เป็นคอลเล็กชันคุณสามารถใช้ตัวห้อยเพื่อรับคำนำหน้าและคำต่อท้าย

let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str[..<prefixIndex]) // Hello

let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str[suffixIndex...]) // ground

อ่านเพิ่มเติม


5

คำนำหน้าและคำต่อท้ายความเท่าเทียมกัน

หากต้องการตรวจสอบว่าสตริงมีคำนำหน้าสตริงหรือคำต่อท้ายหรือไม่ให้เรียกใช้เมธอด hasPrefix ( :) และ hasSuffix ( :) ของสตริงซึ่งทั้งสองวิธีใช้อาร์กิวเมนต์ประเภท String เดียวและส่งคืนค่าบูลีน

Apple Doc

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