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

时间:2014-12-10 15:23:46

标签: objective-c swift tokenize

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

所以我的问题是:

  • 忽略符号和标点符号作为令牌的预期行为?
  • 有没有办法让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

- UPDATE -

我添加了objective-c标签,因为这也适用于obj-c。

1 个答案:

答案 0 :(得分:5)

好的,经过多次回顾,我找到了一些答案。

  

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

是的,kCFStringTokenizerUnitWord只会将单词作为标记提取出来,所以这是预期的行为。我使用了错误的CFStringTokenizer选项。

  

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

我本应该使用kCFStringTokenizerUnitWordBoundary代替。它将符号捕获为标记。这样做的缺点是空间也被捕获为标记,但很容易被一些额外的逻辑忽略。

  

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

&lt; shakeshead&gt;感觉就像这里的新手一样,它们是位掩码,而不是字面值。&lt; / shakeshead&gt;因此,我使用逻辑运算符测试原始值是错误的方法。按位运算符是测试令牌类型的正确方法。