2017-02-03 62 views
0

我有两个正则表达式模式,我正在使用vC++程序进行输入字符串匹配。这两种模式匹配导致堆分配失败..所以我想重写它们。我正在使用regex_search()api调用。如何重写给定的贪婪正则表达式模式?

请让我知道如何重写它们,使它们不会变得贪婪,从而避免崩溃。

(\%3E)(.)*(\%3C) 

>.*</?(\w|\s)*\b(script|applet)\b 

代码:

cmatch regexMatch; 
regex_search(pbuf, regexMatch, regex(iter.second, regex_constants::icase), regex_constants::match_any); 

输入缓冲器:
STATE[2]=TX&SHIPTOPHONE[10]=1111111111&SUBMIT=Continue+for+xxxxxxxxx+xxxx+%3EIGT&DISCOUNT[4]=0.00&_PRODUCTCODE[1]=0&TEMPLATE[9]=xxxxxxxxx&METHOD[2]=xx&VENDOR[9]=xxxxxxxxx&SHIPTOFIRSTNAME[6]=xxxxxx&SHIPTOEMAIL[18][email protected]&PARTNER[8]=xxxxxxxx&SHIPTOSTATE[2]=xx&DUTYAMT[4]=0.00&CITY[10]=xxxxxxxxxx&COUNTRYCODE[2]=XX&DESCRIPTION[4]=aepn&TRXTYPE[1]=S&PHONENUM[10]=1111111111&USER2[10]=22.2.22.22&FREIGHTAMT[4]=0.00&_HOSTEDCODE[1]=1&PWD[28]=XXXXXXXXXXXXXXXXXXXXXXXXXXXXSHIPTOCITY[10]=xxxxxxxxxx&_PAYMENTCODE[1]=1&LASTNAME[8]=xxxxxxxx&TENDER[1]=C&SHIPTOZIP[5]=80000&USER[14]=xxxxxxxxxXXXXX&AMT[5]=10.05&EXECUTOR[12]=xxxxxxxxxXXX&ZIP[5]=80000&EXPDATE[4]=0101&TAXAMT[4]=0.00&COUNTRY[2]=US&PLAN[4]=teen&CURRENCY[3]=USD

谢谢!普尼特

+0

将'*'更改为'*?'使其非贪婪。 – Barmar

+0

你确定要'(。)*'而不是'(。*)'吗?使用'(。)*',您只能捕获第一个字符,而不是整个文本块。 – Barmar

+0

如果存在多种匹配正则表达式的方式(例如'%3Exxx%3Cxxx%3C'),那么它是否会发现不匹配的问题? – Laurel

回答

1

您需要重新鞋面你定义一个量化的捕获组单个字符图案交替(即(.)* - >(.*)(\w|\s)* - >[\w\s]*)的部分,使用延迟匹配 - 的情况下(.*>.*?)您需要将匹配找到后续模式的最左边的匹配项。

使用

(%3E)(.*?)(%3C) 

>.*?</?[\w\s]*\b(script|applet)\b 

不要忘了使用非原始字符串字面量双通道及单逃逸原字符串文字。