gpt4 book ai didi

C 正则表达式如何匹配任何以“或任何空字符串结尾的字符串?

转载 作者:行者123 更新时间:2023-11-30 15:17:32 27 4
gpt4 key购买 nike

我正在尝试生成代码来从逗号分隔的文本文件中逐行读取输入。我只对其中 3 个字段感兴趣,因此我会跳过其余字段。问题是其中 2 个字段是包含在引号中的字符串,其中之一实际上是可选的。

例如,两个连续的行可能如下所示:

0,,10004,10004,"Albany Hwy After Galliers Av","",-32.13649428,116.0176090070,3
0,,10005,10005,"Albany Hwy Armadale Kelmscott Hospital","Armadale Kelmscott Hospital",-32.13481555555560,116.017707222222,3

由于我对字符串不感兴趣(我只对其中一些数字感兴趣),因此我只是使用 scanf 中的 * 运算符跳过它们。对于第一个字符串,这很容易,因为这是一个必填字段,所以我可以跳过第一个双引号匹配到第二个双引号之前的所有内容的正则表达式,如下所示:

\"%*[^\"]

我遇到的问题是第二个字段,就在第一个字段之后。问题是这个字段是可选的;因此它可能有文本,也可能没有。每当它不存在时,我上面列出的正则表达式就无法正常工作,并且该行的整个 scanf 操作都会失败。尽管我尽了最大努力,但我无法生成一个正则表达式来成功匹配第二个双引号之前的所有内容以及匹配空字符串。有谁知道我如何修改我的正则表达式来执行这样的功能?

附:这是我的 scanf 操作的示例:

    res = sscanf(buf, "%*d,,%ld,%*ld,\"%*[^\"]\",\"%*[]\",%lf,%lf,%*d", &cursid, &curslat, &curslong);

最佳答案

以下是基本的 CSV 解析器:

void readCSVline(char *line);
char *readCSVfield(char *line, char *buf);
void readCSVdemo(void)
{
char line[]= "0,,10004,10004,\"Albany Hwy After Galliers Av\",\"\",-32.13649428,116.0176090070,3";
readCSVline(line);

}
/* readCSVline is where you put your "intelligence* about fields to read
* and what to do with them
*/
void readCSVline(char *line)
{
char field1[80], *lineptr=line;
int nfields=0;

while (*lineptr) {
lineptr= readCSVfield(lineptr, field1);
printf("%s\n", field1);
nfields++;
}
printf("%d fields read.\n", nfields);
}
/* readCSVfield reads a field from a CSV line until the next comma or end-of-line.
* It returns where the reading stopped.
*/
char *readCSVfield(char *line, char *buf)
{
int instr= FALSE; // track whether we are in a string
char *cptr= line;

while (*cptr)
{
if (instr) {
if (*cptr=='"') {
char cc= *++cptr;
if (cc=='"') // escaped double quote
*buf++ = '"';
else {
*buf='\0';
cptr--;
instr= FALSE;
}
}
else *buf++ = *cptr;
}
else switch (*cptr) {
case '"': instr= TRUE; break;
case ',': cptr++; *buf= '\0'; return(cptr);
case ' ': case '\t': case '\n': case '\r': break;
default: *buf++ = *cptr;
}
cptr++;
}
*buf= '\0';
return(cptr);
}

注意:处理带引号的字符串中的换行

通常使用调用者已读取的行来调用解析器。为了能够处理带引号的字符串中的回车符/换行符,解析器必须通过获取下一行来处理查看 \nreadCSVfield 的签名应包含行缓冲区及其大小。

关于C 正则表达式如何匹配任何以“或任何空字符串结尾的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32349263/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com