我在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。
答案 0 :(得分:2)
在这里,看看the manual page for sscanf()
关于正则表达式的内容:
要清楚,上面的引用是空的,因为“常规”一词没有出现在手册页中。这是因为与sscanf()
和朋友一起使用的模式是不是正则表达式。你似乎期望它们成为混乱。
字符范围语法%[]
的描述如下:
[
匹配指定的一组接受字符中的非空字符序列;下一个指针必须是指向char的指针,并且字符串中的所有字符必须有足够的空间,加上一个终止的空字节。通常跳过前导空格被抑制。该字符串由特定集合中的字符组成(或不在其中);该集合由开括号[字符和近括号]字符之间的字符定义。
如果开括号后面的第一个字符是旋音(^),则该组会排除这些字符。要在组中包含一个小括号,请将其作为开括号或旋转后的第一个字符;任何其他职位都将结束该集合。
连字符 - 也很特别;当放置在两个其他字符之间时,它会将所有插入的字符添加到集合中。要包含连字符,请将其设置为最后一个关闭括号之前的最后一个字符。例如,[^] 0-9-]表示集合“除了近括号,零到九和连字符之外的所有内容”。该字符串的结尾是字符的外观不在(或带有旋律,in)设置或字段宽度用完时。