jul*_*z78 2 objective-c tokenize swift
我只是学习Swift并使用CFStringTokenizer,我注意到当字符串被标记化时,标点符号和符号被忽略.我对Tokenization这个主题不太熟悉,但我想更好地理解tokenizer如何工作,如果我需要做更复杂的标记化,需要我找到诸如"!"之类的东西.或"+".任何帮助将不胜感激.
所以我的问题是:
这是我一直在使用的游乐场:
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
Run Code Online (Sandbox Code Playgroud)
--UPDATE--
我添加了objective-c标记,因为它也适用于obj-c.
好吧,经过多次环顾四周,我找到了一些答案.
是否忽略符号和标点符号作为标记的预期行为?
是的,kCFStringTokenizerUnitWord只会将单词作为标记,因此它是预期的行为.我使用了错误的CFStringTokenizer选项.
有没有办法让CFStringTokenizer将符号视为一个标记或将一个符号作为一个标记的一部分?即"+"," - 3"或"世界!"
我应该一直在使用kCFStringTokenizerUnitWordBoundary.它将符号捕获为标记.这样做的缺点是空间也被捕获为令牌,但是通过一些额外的逻辑很容易被忽略.
有人还可以解释CFStringTokenizerTokenType如何用于测试令牌的类型?
<shakeshead>在这里感觉像一个全新的,它们是位掩码,而不是字面值.</ shakeshead>因此,我用逻辑运算符测试原始值是错误的方法.按位运算符是测试令牌类型的正确方法.
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |