如何在Swift中检查一个字符串是否以特定前缀或后缀开头?

113

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

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

我还想获取前缀和后缀字符串。我可以像这里这里回答的那样找到一个子字符串,但在Swift中使用范围太麻烦了。

有更简单的方法吗?

(在阅读文档时,我偶然发现了答案,由于我的搜索术语没有出现SO答案,因此我将我的问答添加到这里。)

2个回答

231

已更新至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"

方法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.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 文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接