与scanf()或sscanf()一起使用的正则表达式

时间:2013-11-28 15:27:01

标签: c regex scanf

我知道正则表达式不能用于这些函数。但仍有很少的表达式可用于有效地解析表达式。

我在搜索中发现的一些表达式是*, [], ^等,但无法获得任何相同的文档帮助。几个例子如下,

scanf("%*[ ]%ns%*[ ]\n",str); or
enter code here
MAIN_STRING = "bhupesh, bhupesh.pant@gmail.com,";
std::string str1;
std::string str2;
sscanf(MAIN_STRING.c_str(), "%[^,] %[^,]", str1.c_str(), str2.c_str());

输出: -

str1 = bhupesh
str2 = bhupesh.pant@gmail.com

我想知道可以在这种情况下使用的所有可能符号和正则表达式符号。 我正在写一个简单的解析器,所以只是想知道我是否可以使用它。

3 个答案:

答案 0 :(得分:5)

您需要处理搜索技巧。一个提示是搜索“man X”,其中X是标准库函数。

这将从Linux(以及其他平台)中为您带来the manual pages,这通常非常好。

例如,链接页面说明[

  

匹配指定的接受字符集中的非空字符序列;下一个指针必须是指向char的指针,并且字符串中的所有字符必须有足够的空间,加上一个终止空字节。通常跳过前导空格被抑制。该字符串由特定集合中的字符组成(或不在其中);该集合由open括号[character和close bracket]字符之间的字符定义。如果开括号后的第一个字符是旋音(^),则该组将排除这些字符。要在组中包含一个小括号,请将其作为开括号或旋转后的第一个字符;任何其他位置将结束该集。连字符 - 也很特别;当放置在两个其他字符之间时,它会将所有插入的字符添加到集合中。要包含连字符,请将其设置为最后一个关闭括号之前的最后一个字符。例如,[^] 0-9-]表示集合“除了近括号,零到九和连字符之外的所有内容”。该字符串的结尾是字符的外观不在(或带有旋律,in)设置或字段宽度用完时。

答案 1 :(得分:3)

可以找到文档here。摘录:

  

[characters] Scanset之间指定的任意数量的字符   括号。短划线( - )不是第一个字符可能产生的   某些库实现中的非可移植行为。

     

[^ characters]否定扫描集任何数量的字符都不是   指定为括号之间的字符。

     

*可选的起始星号表示要从流中读取数据但忽略该数据(即它不存储在该位置   一个论点指出。)

没有比这更多的了。

要获得更多的表现力,您需要查找LexBison

答案 2 :(得分:1)

它们不是正则表达式,它们使用非常简单的算法进行匹配。

使用“Flex”和“Bison”(它们齐头并进)来做到这一点。

要了解有限状态自动机和正则表达式,请参阅“Tobias”的书(IIRC),称为“编译器设计简介”,第一部分是lexing阶段,用于查找令牌的正则表达式。

<强>附录

Flex(和Bison)真的非常简单,即使解析CSV文件也更好,它们是一流的工具,并且真的不受重视。