objective-c - CFStringTokenizer 是否应该忽略标点符号?

标签 objective-c swift tokenize

我只是在学习 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/

相关文章:

swift - 将运算符重载为通用函数

java - Elasticsearch java中带有not_analyzed的索引字段

ios - 检查字符串是否具有有效数字

objective-c - 一个类别可以同时实现一个协议(protocol)吗?

ios - Swift:构建还是不构建

ios - 如何在 Swift 3 中为在 for 循环期间修改的数组编写 for 循环?

c - C中的嵌套strtok函数问题

java - Android:考虑2个分隔字符分割字符串

ios - Objective C - 使用 NSString 的 Switch 语句

iphone - 应用程序设计提醒(UILocalNotifications?)