2015-03-31 43 views
-4

我需要使用正则表达式从变量捕获数据。数据可在表格中找到:Ip=8.8.8.8&probe=ip/tcp{dst=53} 例如。C++正则表达式

要使用实现这个我真的:

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); 

第二个字段将始终包含A /但我不能让这个和其他特殊carachters({} =)

能有什么我做?

我已经尝试过:

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

,也没有成功的为好。

+1

哪个资源让你接种了'sscanf()'支持正则表达式? – 2015-03-31 21:07:45

+0

正如Jerry Coffin所说,sscanf不支持完整的正则表达式,但它们确实支持scansets! – user2375607 2015-04-01 16:37:38

+0

更新:对于IP领域,完全没有问题,它按照我发布的方式工作。 IP字段通常会收到IP地址或网页(例如www.google.com)。探测字段可能会有所不同,所以它不会总是以{}结束,例如TCP/IP或IP/tcp {dst = 53}等。现在我明白了问题所在。我正在接收来自Web浏览器的数据并且符号({}/=)被编码(例如%7B%7D%3D)现在我需要找到一种方法让我的软件将%7B%7D%3D识别为{ } =例如。任何想法?提前致谢。 – user2375607 2015-04-01 16:46:52

回答

0

既然你知道有}并用&的IP部分末端的probe部分结束,它可能最容易只扫描那些:

sscanf(input, "Ip=%[^&]&probe=%[^}]", ipt, probe); 

一个小细节:scanf与无论是扫描集或%s转换需要以指定具有任何安全性的缓冲区大小。没有长度,两者几乎等同于gets缺乏安全,让你真正想要的东西,如:

char ipt[256], probe[256]; 
sscanf(input, "Ip=%255[^&]&probe=%255[^}]", ipt, probe); 

另外请注意,这会给你的probe部分没有}。如果你真的需要它,你可以使用类似strncat的东西,然后重新添加它。

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

+0

感谢您的想法。对于知识产权领域来说,没有任何问题,它按照我发布的方式工作。 IP字段通常会收到IP地址或网页(例如www.google.com)。探测字段可能会有所不同,所以它不会总是以{}结束,例如TCP/IP或IP/tcp {dst = 53}等。但是,您所说的有助于了解问题所在。我正在接收来自Web浏览器的数据并且符号({}/=)被编码(例如%7B%7D%3D)现在我需要找到一种方法让我的软件将%7B%7D%3D识别为{ } =例如。任何想法?提前致谢。 – user2375607 2015-04-01 16:44:55

+0

@ user2375607:显然的方法是通过解码器运行数据,在尝试解析/搜索之前将这些编码序列转换回目标字符。 – 2015-04-01 16:46:45

+0

我会试试看。谢谢。 – user2375607 2015-04-01 16:58:51