如何在 Swift 中检查字符串以(前缀)开头或以(后缀)结尾

Posted

技术标签:

【中文标题】如何在 Swift 中检查字符串以(前缀)开头或以(后缀)结尾【英文标题】:How to check what a String starts with (prefix) or ends with (suffix) in Swift 【发布时间】:2015-10-06 10:18:04 【问题描述】:

我正在尝试测试 Swift 字符串是否以某个值开头或结尾。这些方法不存在:

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

我还想获取前缀和后缀字符串。正如here 和here 所回答的那样,我可以找到一个子字符串,但是范围在Swift 中是如此的痛苦。

有没有更简单的方法?

(我在阅读 the documentation 时偶然发现了答案,由于我的搜索词没有出现 SO 答案,所以我在这里添加我的问答。)

【问题讨论】:

【参考方案1】:

为 Swift 4 更新

检查字符串的开头和结尾

您可以使用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"

方法一:(推荐)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

当然,有时崩溃是好的,因为它们让您知道您的代码存在问题。所以也考虑下面的第二种方法。如果索引超出范围,它将引发错误。

方法二:prefix(upto:)suffix(from:)

Swift 字符串索引很棘手,因为它们必须考虑特殊字符(如表情符号)。但是,一旦获得索引,就很容易获得前缀或后缀。 (参见String.Index 上的my other answer。)

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创建一个索引(再次参见this answer)。

方法三:下标

由于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

进一步阅读

Strings and Characters documentation

【讨论】:

【参考方案2】:

前缀和后缀相等

检查一个字符串是否有特定的字符串前缀或后缀, 调用字符串的 hasPrefix(:) 和 hasSuffix(:) 方法,两者 它接受一个字符串类型的参数并返回一个布尔值 价值。

Apple Doc

【讨论】:

以上是关于如何在 Swift 中检查字符串以(前缀)开头或以(后缀)结尾的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 CComBSTR 是不是以某个前缀开头?

SWIFT 检查字符串是不是以某些东西开头,但第二个字符可以是任何东西

如何选择仅以特定前缀开头的字符串

正则表达式:如何匹配不以前缀列表开头的子字符串

在 Bash 中,如何检查字符串是不是以某个值开头?

在检查比特币块时,为什么一旦找到正确的随机数就会得到一个前导零的前缀?