如何在Swift字符串中找到子字符串的最后一个出现位置?

27

在Objective-C中我使用了:

[@"abc def ghi abc def ghi" rangeOfString:@"c" options:NSBackwardsSearch];

但是现在貌似没有NSBackwardsSearch。有人可以提供Swift的等效代码吗?

如果可能,我想能够查找整个字符串中的字符编号。所以在上面的示例中,它将返回3。

4个回答

39

如果你想替换字符串中的最后一个子字符串:

(Swift 3)

extension String
{
    func replacingLastOccurrenceOfString(_ searchString: String,
            with replacementString: String,
            caseInsensitive: Bool = true) -> String
    {
        let options: String.CompareOptions
        if caseInsensitive {
            options = [.backwards, .caseInsensitive]
        } else {
            options = [.backwards]
        }

        if let range = self.range(of: searchString,
                options: options,
                range: nil,
                locale: nil) {

            return self.replacingCharacters(in: range, with: replacementString)
        }
        return self
    }
}

用法:

let alphabet = "abc def ghi abc def ghi"
let result = alphabet.replacingLastOccurrenceOfString("ghi",
        with: "foo")

print(result)

// "abc def ghi abc def foo"

或者,如果你想完全删除最后一个子字符串并将其清理干净:

let result = alphabet.replacingLastOccurrenceOfString("ghi",
            with: "").trimmingCharacters(in: .whitespaces)

print(result)

// "abc def ghi abc def"

同样在Swift 4.2中完美运行。 - Adam S.
干得好。完美运作。 - Siddhesh Bhide

23

Cocoa框架应该可以在Swift中访问,但是你需要导入它们。尝试导入Foundation以访问NSString API。来自“使用Swift与Cocoa和Objective-C”指南的“使用Cocoa数据类型-字符串”:

Swift会自动在String类型和NSString类之间进行桥接。[...] 要启用字符串桥接,只需导入Foundation。

此外,NSBackwardsSearch是一个枚举值(标记并作为option导入),因此您必须使用Swift的enum / option语法来访问它(作为NSStringCompareOptions选项类型的一部分)。前缀从C enumeration值中剥离,因此从值名称中删除NS
总之,我们有:
import Foundation
"abc def ghi abc def ghi".rangeOfString("c", options:NSStringCompareOptions.BackwardsSearch)

请注意,您可能需要使用distanceadvance函数来正确利用rangeOfString的范围。

17

Swift 3.0:

"abc def ghi abc def ghi".range(of: "c", options: String.CompareOptions.backwards, range: nil, locale: nil)

-1

Swift 5:

"abc def ghi abc def ghi".range(of: "c", options: NSString.CompareOptions.backwards)

1
在Swift的这个版本中,建议使用String而不是NSString。此外,这似乎只是复制了4年前给出的解决方案,如果您正在回答一个旧问题,请确保您的答案比现有的答案更有价值。 - Cristik

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