即使重复,如何获得特定子字符串的范围

时间:2016-09-26 09:57:07

标签: ios regex swift

我想检测以#开头的单词,并返回其特定范围。最初我尝试使用以下代码:

for word in words {
    if word.hasPrefix("#") {
        let matchRange = theSentence.range(of: word)
        //Do stuff with this word
    }
}

这样可以正常工作,除非你有一个重复的主题标签,它将返回第一次出现主题标签的范围。这是因为range(_:)函数的性质。

说我有以下字符串:

"The range of #hashtag should be different to this #hashtag"

这将为两个主题标签返回(13, 8),实际上它应该返回(13, 8)以及(50, 8)。怎么解决这个问题?请注意,也应该能够在标签中检测到表情符号。

修改

如果您想知道如何使用emojis来执行此操作,请转到here

2 个答案:

答案 0 :(得分:9)

为此创建正则表达式并将其与NSRegularExpression一起使用,并找到匹配范围。

var str = "The range of #hashtag should be different to this #hashtag"
let regex = try NSRegularExpression(pattern: "(#[A-Za-z0-9]*)", options: [])
let matches = regex.matchesInString(str, options:[], range:NSMakeRange(0, str.characters.count))
for match in matches {
    print("match = \(match.range)")
}

答案 1 :(得分:0)

为什么不在每个块以#开头的块中分隔你的单词。然后你就可以知道你的单词#出现在句子中的次数。

编辑:我认为正则表达式的答案是最好的方法,但这是同一解决方案的另一种方法。

var hastagWords = [""]
for word in words {
    if word.hasPrefix("#") {
        // Collect all words which begin with # in an array
        hastagWords.append(word)
    }
}

// Create a copy of original word since we will change it
var mutatedWord = word.copy() as! String

for hashtagWord in hastagWords {
    let range = mutatedWord.range(of: hashtagWord)

    if let aRange = range {
        // If range is OK then remove the word from original word and go to an other range
        mutatedWord = mutatedWord.replacingCharacters(in: aRange, with: "")
    }
}