不使用strtok()在C中进行标记化

不使用strtok()在C中进行标记化,c,regex,token,tokenize,C,Regex,Token,Tokenize,我试图根据以下条件对输入字符串进行标记:标记被定义为带引号的字符串、一组非空格字符或字符。显然,在这种情况下,strtok将不起作用,所以我想也许可以使用regex?或者也许有一个我还没有想到的更简单的解决方案 以前有没有人遇到过这个问题,或者甚至有人建议我如何处理这个问题?谢谢 人们仍然使用lex和yacc吗?如果没有,您可能希望自己创建一个状态机,并使用您的输入一次一个字符来为状态机提供输入以使用您的输入。这就是lex要做的。做你自己的解析器。正则表达式通常用于更复杂的表达式,但这是个好主意

我试图根据以下条件对输入字符串进行标记:标记被定义为带引号的字符串、一组非空格字符或
字符。显然,在这种情况下,
strtok
将不起作用,所以我想也许可以使用regex?或者也许有一个我还没有想到的更简单的解决方案


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

人们仍然使用lex和yacc吗?如果没有,您可能希望自己创建一个状态机,并使用您的输入一次一个字符来为状态机提供输入以使用您的输入。这就是lex要做的。

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


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

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


但是,如果您不想从头开始构建它,请查看
lex
(或
flex
),它将从
lex
源文件中构建一个C中的tokenise。

如果您想尝试一个regex fast,并使用稍后将使用的输入,请尝试。
您可以粘贴输入,它会显示正则表达式匹配的内容。

以有限状态机的形式编写自定义lexer。你的语法非常简单,这将相当容易。当要求一个正则表达式解决方案时,请包括一个你想匹配的项目列表和另一个你想省略的项目列表。为什么
strtok
不起作用?您可以指定多个分隔符。就strtok而言:对于CSV,您可以使用
“,;\t\r\n”
标记,每个字符都是分隔符。。。在处理strtok_r时,带引号的字符串可能更容易,但带引号的字符串是否可以包含转义序列?i、 e.如何在字符串中包含
”,以及是否需要翻译
\n
之类的内容?我相信strtok()不会起作用,因为如果我有以下字符串:abc“this is fun”,标记化的输出将是:abc,“this,is,fun”“这不是我正在寻找的输出,即:abc,而是有趣的
strtok
不会自动为您处理带引号的字符串,但您可以(例如)使用
strtok
查找分隔符边界,并且这些delimeters将是可变的。在不解析字符串常量时,可以将空格和
作为分隔符。在解析字符串常量时,只能将
作为分隔符
strtok()
只是一个美化的
for
循环,它搜索一组字符中的一个并插入一个
\0
;如果您正在编写自己的解析器,那么您将需要类似的东西。为了更轻松地生活,请使用
lex
(或
flex
)。