使用正则表达式用分号分隔解析字符串

时间:2015-06-12 12:58:35

标签: c scanf

我正在尝试使用正则表达式分隔一串数字。当数字用逗号分隔时,以下C代码有效:

#include <stdio.h>

int main()
{ 
    char *multiple = "0.20,0.37,0.75,0.56";
    char one[4];
    char two[4];
    char three[4];
    char four[4];

    sscanf(multiple, "%[^','], %[^','], %[^','], %[^',']", one, two, three, four);
    printf("one %s, two %s, three %s, four %s\n", one, two, three, four);

    return 0;
}

然而,在我的代码中,它们用分号分隔,我想做同样的事情。只是,它在这种情况下不起作用:

#include <stdio.h>

int main()
{
    char *multiple = "0.20;0.37;0.75;0.56";
    char one[4];
    char two[4];
    char three[4];
    char four[4];

    sscanf(multiple, "%[^';'], %[^';'], %[^';'], %[^';']", one, two, three, four);
    printf("one %s, two %s, three %s, four %s\n", one, two, three, four);

    return 0;
}

任何人都可以让我知道为什么会这样,以及如何解决它?

3 个答案:

答案 0 :(得分:2)

scanf不支持正则表达式。它支持给定字符集的字符串。当您的格式包含%[^';']时,它会匹配 ';之外的任何一个或多个字符的序列。当您的格式包含逗号(,)时,它会与逗号匹配。

所以当你说:

sscanf(multiple, "%[^';'], %[^';'], %[^';'], %[^';']", one, two, three, four);

它尽可能匹配';以外的其他字符,并将其存储在one中。然后它尝试匹配,,这将失败(导致scanf返回1 - 匹配和存储的一件事),因为任何逗号都包含在one中 - 下一个字符只能是;'

你想要的是

if (sscanf(multiple, "%[^;];%[^;];%[^;];%[^;]", one, two, three, four) != 4)
    /* failed -- do something appropriate */

您应该始终检查scanf的返回值,看它是否与您的所有模式匹配,并抓住了您认为应该的数量。

另请注意格式中缺少空格 - 空格将匹配(并跳过)字符串中0个或更多空白字符的任何序列。这实际上可能就是你想要的(在你提取的每个字段中去除前导空格),但不是你所描述的那样

答案 1 :(得分:1)

使用分号执行与注释相同的操作

sscanf(multiple, "%[^';'];%[^';'];%[^';'];%[^';']", one, two, three, four);

为什么,我不知道,因为scanf系列函数中的格式说明符通常不被认为是正则表达式。我不知道有关scanf功能的所有细节。

答案 2 :(得分:0)

在这里,这应该有效:

#include <stdio.h>

int main()
{ 
    char * multiple("0.20,0.37,0.75,0.56");
    char one[10];
    char two[10];
    char three[10];
    char four[10];

    sscanf(multiple, "%[^';'];%[^';'];%[^';'];%[^';']", one, two, three, four);
    printf("one %f, two %f, three %s, four %s\n", one, two, three, four);

    return 0;
}