我想检测以#
开头的单词,并返回其特定范围。最初我尝试使用以下代码:
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
答案 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: "")
}
}