【问题标题】:Tokenizing in C without strtok() [closed]在没有 strtok() 的情况下在 C 中进行标记[关闭]
【发布时间】:2014-02-13 13:57:18
【问题描述】:

我正在尝试根据标记定义为带引号的字符串、一组非空格字符或| 字符的标准对输入字符串进行标记。显然,在这种情况下strtok 将不起作用,所以我想也许使用正则表达式?或者我还没有想到更简单的解决方案?

之前有没有人遇到过这个问题,或者甚至对我如何处理这个问题有过建议?谢谢!

【问题讨论】:

  • 以有限状态机的形式编写自定义词法分析器。你的语法很简单,会相当容易。
  • 当询问正则表达式解决方案时,请提供您想要匹配的项目列表和另一个您想要省略的项目列表。
  • 为什么strtok 不起作用?您可以指定多个分隔符。
  • strtok 而言:对于CSV,您可以 使用",;|\t\r\n" 进行标记,每个字符都是一个分隔符...处理时引用的字符串可能更容易strtok_r,虽然
  • 引用的字符串可以包含转义序列吗?即如何在字符串中包含",是否需要翻译\n之类的内容?

标签: c regex token tokenize


【解决方案1】:

首先,为什么strtok() '显然' 不起作用?您似乎在暗示 strtok() 不能使用多个分隔符;确实如此(char * delim 是指向一组分隔符的指针)。如果您想从头开始构建它,这是一种合理的开始方式。使用正则表达式是一个阶段,但仍然是“从头开始构建”。

但是,如果您不想从头开始构建它,请查看 lex(或 flex),它将根据 lex 源文件在 C 中构建您的标记化。

【讨论】:

  • 我相信 strtok() 不起作用,因为如果我有以下字符串:abc "this is fun",标记化的输出将是:abc, "this, is, fun" 而不是输出我在找,就是:abc,这很有趣
  • strtok 不会自动为您处理带引号的字符串,但您可以(例如)使用strtok 来查找分隔符边界,并且这些分隔符将是可变的。虽然不解析字符串常量,但您可以查找空格和 " 作为分隔符。在解析字符串常量时,您只会寻找 " 作为分隔符。 strtok() 只是一个美化的for 循环,它搜索一组字符中的一个并插入一个\0;如果您正在编写自己的解析器,您将需要这样的东西。为了更轻松的生活,请使用lex(或flex)。
【解决方案2】:

人们还在使用 lex 和 yacc 吗?如果没有,您可能希望自己创建一个状态机,并一次使用一个字符输入状态机以使用您的输入。无论如何,这就是 lex 会做的事情。

【讨论】:

    【解决方案3】:

    做你自己的解析器。正则表达式通常用于比这更复杂的表达式,但这是个好主意。

    您应该逐个字符地检查字符并使用条件来确定它是否是令牌。

    【讨论】:

      【解决方案4】:

      如果您想快速尝试正则表达式,并在稍后使用输入,请尝试regexr。 您可以粘贴您的输入,它会显示您的正则表达式匹配的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多