我只是在学习 Swift 并尝试使用 CFStringTokenizer,我注意到当字符串被标记化时,标点符号和符号会被忽略。我不太熟悉标记化的主题,但如果我需要进行更复杂的标记化,需要我找到诸如“!”之类的东西,我想更好地了解标记器的工作原理。或“+”。任何帮助将不胜感激。
所以我的问题是:
- 忽略符号和标点符号作为标记是预期的行为吗?
- 有没有办法让 CFStringTokenizer 将符号视为标记或将符号保留为标记的一部分?即“+”、“-3”或“世界!”
- 有人可以解释一下 CFStringTokenizerTokenType 如何用于测试 token 类型吗?
这是我一直在使用的 playground:
import Cocoa
var str = "I have 2 pairs of pants + five shirts, but threw out 3 socks with holes! 2+5-3"
var tokens: [(token: String, range: CFRange, type: CFStringTokenizerTokenType)] = []
var strLen = countElements(str)
var strRng = CFRangeMake(0, strLen)
var flag = UInt(kCFStringTokenizerUnitWord)
var locale = CFLocaleCopyCurrent()
var tknizr = CFStringTokenizerCreate( kCFAllocatorDefault, str, strRng, flag, locale)
var tknType = CFStringTokenizerAdvanceToNextToken(tknizr)
do {
var tRng = CFStringTokenizerGetCurrentTokenRange(tknizr)
var from = advance(str.startIndex, tRng.location)
var to = advance(from, tRng.length)
var substrRng = Range<String.Index>(start: from, end: to)
var substr = str.substringWithRange(substrRng)
println("String: \(substr)")
println("Token Type: \(tknType.rawValue)\n")
tokens += [(substr, tRng, tknType)]
tknType = CFStringTokenizerAdvanceToNextToken(tknizr)
} while tknType.rawValue != 0
--更新--
我添加了 objective-c 标签,因为这也适用于 obj-c。
最佳答案
好吧,在四处寻找之后,我找到了一些答案。
Is the ignoring of symbols and punctuation as tokens expected behaviour?
是的,kCFStringTokenizerUnitWord
只会提取单词作为标记,因此这是预期的行为。我为 CFStringTokenizer 使用了错误的选项。
Is there a way to get CFStringTokenizer to treat a symbol as a token or to keep a symbol as part of a token? i.e. "+", "-3" or "world!"
我应该一直使用 kCFStringTokenizerUnitWordBoundary
来代替。它将捕获符号作为标记。这样做的缺点是空格也被捕获为标记,但很容易被一些额外的逻辑忽略。
Can someone also explain how the CFStringTokenizerTokenType works for testing the type of token?
关于objective-c - CFStringTokenizer 是否应该忽略标点符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27404663/