【问题标题】:Swift: converting string to a list of word and range in the stringSwift:将字符串转换为字符串中的单词和范围列表
【发布时间】:2020-12-15 02:10:08
【问题描述】:

如果我有一句话说:

a fox jumps over another fox

我需要将其映射到字符串中对应范围的单词列表,例如,第一个“狐狸”应该映射到:

["fox", NSRange(2, 3)]

这里的困难是像两个“狐狸”这样的重复单词,我可以检查字符串中每个单词的索引,并在我去的时候删除单词(从字符串中),但是有没有更聪明的方法来做到这一点?

另一个挑战是当单词中有点时,说:

a fox jumps over another f.x

如果我搜索“f.x”的范围,它可能也会匹配“fox”?

谢谢!

【问题讨论】:

  • 所以如果一个单词是重复的,你只希望单词第一次出现?
  • 谢谢@Sweeper 我想要句子中的每个单词及其在句子中的范围,例如“狐狸跳过另一只狐狸”中的两个“狐狸”应该给我(“狐狸”,range1) and ("fox", range2) 其中 range1 和 range2 不同。

标签: ios swift string


【解决方案1】:

您可以使用 String 方法 enumerateSubstrings(in:, options:) 并使用 byWords 选项:

func enumerateSubstrings<R>(in range: R, options opts: EnumerationOptions = [], _ body: @escaping (String?, Range<Index>, Range<Index>, inout Bool) -> Void) where R : RangeExpression, R.Bound == Index

extension String {
    var byWordsAndRanges: [(String, Range<Index>)] {
        var wordsAndRanges: [(String, Range<Index>)] = []
        enumerateSubstrings(in: startIndex..., options: .byWords) { word, range, _, _ in
            // The force unwrap of word is safe. It will only be nil if `substringNotRequired` is included in opts
            wordsAndRanges.append((word!, range))
        }
        return wordsAndRanges
    }
}

let test = "a fox jumps over another fox"
for (word, range) in test.byWordsAndRanges {
    print("word:", word)
    print("substring:", test[range])

}

这将打印:

单词:a
子字符串:a
词:狐狸
子字符串:狐狸
词:跳跃
子字符串:跳跃
词:结束
子字符串:over
词:另一个
子字符串:另一个
词:狐狸
子字符串:狐狸

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 2011-09-05
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多