C++ C++;正则表达式

C++ C++;正则表达式,c++,regex,cgi,C++,Regex,Cgi,我需要使用正则表达式从变量中捕获数据。数据可通过以下形式获得:Ip=8.8.8.8&probe=Ip/tcp{dst=53} 比如说 为了实现这一点,我使用了: char *data; data = getenv("QUERY_STRING"); char ipt[40]; char probe[40]; sscanf(data,"ip=%[0-9a-zA-Z-.]&probe=%[0-9a-zA-Z-.{}/=]",ipt,probe); 第二个字段将始终包含/但我无法获取此字段和

我需要使用正则表达式从变量中捕获数据。数据可通过以下形式获得:
Ip=8.8.8.8&probe=Ip/tcp{dst=53}
比如说

为了实现这一点,我使用了:

char *data;
data = getenv("QUERY_STRING");
char ipt[40];
char probe[40]; 
sscanf(data,"ip=%[0-9a-zA-Z-.]&probe=%[0-9a-zA-Z-.{}/=]",ipt,probe);
第二个字段将始终包含/但我无法获取此字段和其他特殊Carachter({}=)

我能做什么

我已经试过了:

sscanf(data,"ip=%[0-9a-zA-Z-.]&probe=%[(...)]",ipt,probe); 

而且也没有成功。

鉴于您知道
探头
部分以
}
结尾,IP部分以
&
结尾,可能最容易扫描以下各项:

sscanf(input, "Ip=%[^&]&probe=%[^}]", ipt, probe);
一个次要细节:
scanf
使用扫描集或%s转换时,需要指定缓冲区大小才能确保安全。如果没有长度,由于缺乏安全性,两者几乎相当于
get
,因此您确实需要如下内容:

char ipt[256], probe[256];
sscanf(input, "Ip=%255[^&]&probe=%255[^}]", ipt, probe);
还请注意,这将为您提供
探针
部分,而不带尾随的
}
。如果您真的需要它,您可以使用类似于
strncat
的方法在以后添加它


对于那些正在观看的人:不,scanf(和公司)不支持完整的正则表达式,但他们支持Scanset,这就是他在这里使用的。

是哪种资源让你接种了支持正则表达式的
sscanf()
?正如Jerry Coffin所说,sscanf不支持完整的正则表达式,但他们确实支持扫描集!更新:对于IP字段,根本没有问题,它按照我发布的方式工作。IP字段始终接收IP地址或网页(例如www.google.com)。probe字段可以变化,因此它不会总是以}结尾,它可以是,例如TCP/IP或IP/TCP{dst=53}等。现在我了解了问题所在。我正在从web浏览器接收数据,并且符号({}/=)已编码(例如%7B%7D%3D),现在我需要找到一种方法让我的软件将%7B%7D%3D标识为{}=例如。有什么想法吗?提前谢谢。谢谢你的想法。对于IP领域,根本没有问题,它是按照我发布的方式工作的。IP字段始终接收IP地址或网页(例如www.google.com)。probe字段可能会有所不同,因此它不会总是以}结尾。它可以是,例如TCP/IP或IP/TCP{dst=53}等。但是您所说的有助于理解问题所在。我正在从web浏览器接收数据,并且符号({}/=)已编码(例如%7B%7D%3D),现在我需要为我的软件找到一种方法,将%7B%7D%3D标识为{}=例如。有什么想法吗?提前谢谢。@user2375607:显而易见的方法是,在试图解析/搜索数据之前,通过解码器运行数据,将这些编码序列转换回目标字符。