CFStringTokenizer是否应该忽略标点和符号?

jul*_*z78 2 objective-c tokenize swift

我只是学习Swift并使用CFStringTokenizer,我注意到当字符串被标记化时,标点符号和符号被忽略.我对Tokenization这个主题不太熟悉,但我想更好地理解tokenizer如何工作,如果我需要做更复杂的标记化,需要我找到诸如"!"之类的东西.或"+".任何帮助将不胜感激.

所以我的问题是:

  • 是否忽略符号和标点符号作为标记的预期行为?
  • 有没有办法让CFStringTokenizer将符号视为一个标记或将一个符号作为一个标记的一部分?即"+"," - 3"或"世界!"
  • 有人还可以解释CFStringTokenizerTokenType如何用于测试令牌的类型?

这是我一直在使用的游乐场:

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.

jul*_*z78 5

好吧,经过多次环顾四周,我找到了一些答案.

是否忽略符号和标点符号作为标记的预期行为?

是的,kCFStringTokenizerUnitWord只会将单词作为标记,因此它是预期的行为.我使用了错误的CFStringTokenizer选项.

有没有办法让CFStringTokenizer将符号视为一个标记或将一个符号作为一个标记的一部分?即"+"," - 3"或"世界!"

我应该一直在使用kCFStringTokenizerUnitWordBoundary.它将符号捕获为标记.这样做的缺点是空间也被捕获为令牌,但是通过一些额外的逻辑很容易被忽略.

有人还可以解释CFStringTokenizerTokenType如何用于测试令牌的类型?

<shakeshead>在这里感觉像一个全新的,它们是位掩码,而不是字面值.</ shakeshead>因此,我用逻辑运算符测试原始值是错误的方法.按位运算符是测试令牌类型的正确方法.