与glibc中的正则表达式(锚点)不一致

时间:2013-04-25 06:33:51

标签: c regex glibc

我在C中尝试了一些正则表达式的东西,即尝试处理文本文件中的一行:

MY NAME IS   ;;JOHN 

我在sscanf的format参数中使用sscanf并与%s %s %s %[^;]匹配。 当我使用Rubular测试时(也就是说,我在“您的正则表达式:”字段中输入[^;],在“您的测试字符串:”字段中输入;;test),匹配test数据。

然而,使用

sscanf("MY NAME IS ;;JOHN", "%s %s %s %[^;], str1, str2, str3, str4)

第四个字符串str4实际上并不匹配。也就是说,sscanf会返回3。 据我所知,正则表达式[^;]匹配分号以外的任何字符,那么为什么sscanf;;JOHN中的任何字符都不匹配?

这只是sscanf的问题,还是glibc出于某种原因不同地使用正则表达式?是sscanf无法匹配第四个字符串,因为字符串中的第一个字符确实是分号,所以它不能完全匹配字符串吗?这就是它返回3的原因吗?

此外,如果我有MY NAME IS DOE;;JOHN这样的行并使用sscanf,则该函数会返回4。

1 个答案:

答案 0 :(得分:2)

在这里,看看the manual page for sscanf()关于正则表达式的内容:

  

要清楚,上面的引用是空的,因为“常规”一词没有出现在手册页中。这是因为与sscanf()和朋友一起使用的模式是不是正则表达式。你似乎期望它们成为混乱。

字符范围语法%[]的描述如下:

  

[   匹配指定的一组接受字符中的非空字符序列;下一个指针必须是指向char的指针,并且字符串中的所有字符必须有足够的空间,加上一个终止的空字节。

     

通常跳过前导空格被抑制。该字符串由特定集合中的字符组成(或不在其中);该集合由开括号[字符和近括号]字符之间的字符定义。

     

如果开括号后面的第一个字符是旋音(^),则该组会排除这些字符。要在组中包含一个小括号,请将其作为开括号或旋转后的第一个字符;任何其他职位都将结束该集合。

     

连字符 - 也很特别;当放置在两个其他字符之间时,它会将所有插入的字符添加到集合中。要包含连字符,请将其设置为最后一个关闭括号之前的最后一个字符。例如,[^] 0-9-]表示集合“除了近括号,零到九和连字符之外的所有内容”。该字符串的结尾是字符的外观不在(或带有旋律,in)设置或字段宽度用完时。