2017-02-03 61 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 

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