我使用此代码查找NSTextField的字符串内容的NSRange和文本内容。
nstext.enumerateSubstringsInRange(NSMakeRange(0, nstext.length),
options: NSStringEnumerationOptions.ByWords, usingBlock: {
(substring, substringRange, _, _) -> () in
//Do something with substring and substringRange
}
问题是NSStringEnumerationOptions.ByWords
忽略了标点符号,所以
Stop clubbing, baby seals
变为
"Stop" "clubbing" "baby" "seals"
不
"Stop" "clubbing," "baby" "seals
如果所有其他方法都失败了,我可以检查一个给定单词之前或之后的字符,看看它们是否在豁免列表中(我在哪里可以找到哪些字符.ByWords
免除?);但必须有一个更优雅的解决方案。
如何从包含标点符号作为单词一部分的字符串中找到一组单词的NSRanges?
答案 0 :(得分:1)
您可以使用componentsSeparatedByString代替
var arr = nstext.componentsSeparatedByString(“”)
输出:
“停止”“泡吧”,“宝贝”“封印
答案 1 :(得分:1)
受Richa的回答启发,我使用了componentsSeparatedByString(" ")
。我必须添加一些代码才能使它适用于我,因为我想从输出中获取NSRanges。如果有两个相同单词的实例,我也希望它仍然有用 - 例如“请停止泡吧,小海豹”。
这就是我的所作所为:
var words: [String] = []
var ranges: [NSRange] = []
//nstext is a String I converted to a NSString
words = nstext.componentsSeparatedByString(" ")
//apologies for the poor naming
var nstextLessWordsWeHaveRangesFor = nstext
for word in words
{
let range:NSRange = nstextLessWordsWeHaveRangesFor.rangeOfString(word)
ranges.append(range)
//create a string the same length as word so that the 'ranges' don't change in the future (if I just replace it with "" then the future ranges will be wrong after removing the substring)
var fillerString:String = ""
for var i=0;i<word.characters.count;++i{
fillerString = fillerString.stringByAppendingString(" ")
}
nstextLessWordsWeHaveRangesFor = nstextLessWordsWeHaveRangesFor.stringByReplacingCharactersInRange(range, withString: fillerString)
}