【问题标题】:swift 3 get start index (as int) of substringswift 3获取子字符串的开始索引(作为int)
【发布时间】:2023-03-03 03:28:01
【问题描述】:

我想获取字符串中子字符串的开始和结束位置。示例:在字符串“嗨,这是我的名字”中;如果我提供字符串“this”,我想知道起始索引是 4,结束索引是 7。

我找到了几个链接,包括这个:

Swift: get index of start of a substring in a string 字符串中的子字符串

但它在 swift 3 中不起作用,因为该方法现在称为 range。

我现在正在使用这个:

let range = mystring.range(of: "StringSearch")?.lowerBound

返回这个

Swift.String.UnicodeScalarView.Index(_position: 15), _countUTF16: 1))

而且我无法以整数形式获得位置,因为这是一个索引。

总而言之,我希望在 int 类型的变量中有一个位置,在本例中为 15。

谁能帮帮我?

谢谢大家。

【问题讨论】:

  • 您希望索引、字符、UnicodeScalars 还是 UTF-16 代码单元采用什么单位?
  • String 将字符串拆分为子字符串的所有相关方法都需要此索引类型。如果您需要 Int 索引来使用 NSString 方法。摆脱NSString
  • 嗨。我想在 int 类型的 var 中有位置(15 以上),以便我可以在另一种方法中使用。我需要类似 lowerbound.position

标签: swift indexing substring swift3


【解决方案1】:

String 的 distance(from:to:) 方法计算差异 在两个String.Index 值之间:

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

实际上它只是将调用转发到字符串的CharacterView,所以 以上给出的结果与

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.lowerBound)
    let endPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

如果你需要所有个字符串:

let mystring = "this is this and that is that"
var searchPosition = mystring.startIndex
while let range = mystring.range(of: "this", range: searchPosition..<mystring.endIndex) {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos)

    searchPosition = range.upperBound
}

【讨论】:

  • 如果还有一个“this”并且您想找到第二个“this”的开始和结束索引怎么办?
【解决方案2】:

Martin R 将答案改编为函数后,您将首次出现 NSRange。您也可以将其转换为 extension 或 String。

public class func indexOf(string: String, substring: String) -> NSRange? {
    if let range = string.range(of: substring) {
        let startPos = string.distance(from: string.startIndex, to: range.lowerBound)
        return NSMakeRange(startPos, substring.count)
    }
}

【讨论】:

  • 返回一个简单的 Int 怎么样?
猜你喜欢
  • 1970-01-01
  • 2015-05-13
  • 2020-11-17
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多