如何使用带标点符号的NSStringEnumerationOptions.ByWords

时间:2016-01-11 05:12:16

标签: swift macos nsstring nstextfield

我使用此代码查找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?

2 个答案:

答案 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)
            }