如何在代码中检测字符串文字?

时间:2014-03-08 21:07:26

标签: c++ regex c++11

我想为我的混淆器编写字符串检测功能,我一直在调试它,我可以为cout<<"Hello world"cout<<"2+2=4"等字符串编写模式

但不适用于

cout<<"2+2"<<"Trolll";
cout<<"asd \" trololo";

我只是想提取“和”之间的东西,实际上我试过

["][\x20-\x74]*["]

但是对于

cout<<"asdfg"<<"asdsfgh";

它给了我"asdfg"<<"asdfgh",而不是"asdfg"

如何构建字符串提取表达式的任何想法?

1 个答案:

答案 0 :(得分:3)

默认情况下,正则表达式是 greedy 。这意味着他们尽可能地匹配。有几种方法可以防止这种情况发生。最简单的方法是让他们非贪婪。您可以通过附加*

来使量词?非贪婪
"[\x20-\x74]*?"

(顺便说一句,引号周围不需要[…]。)

然而,在描述中明确而准确是有帮助的。其中一个原因是上面的表达仍然是错误的。例如,它与"\""无法正确匹配。

C ++中的字符串文字定义很明确,而你的定义与它不匹配。实际定义(标准的第2.14.3节)是(简化的):由"包围的字符序列,其中字符序列是除"\和换行符或转义序列之外的零个或多个字符的序列。

反过来,转义序列`被定义为简单八进制十六进制。总之,这让我们(再次,略微简化):

"([^"\\]|\\(['"?\\abfnrtv]|[0-7]+|x[0-9a-fA-F]+))*"

- 现在不需要非贪婪的说明符,因为我们明确地排除"之前的匹配,除非转义。