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

Спасибо !! Puneet

+0

Изменить '*' на '*?', Чтобы сделать его неживым. – Barmar

+0

Вы действительно хотите '(.) *', А не '(. *)'. С '(.) *', Вы захватываете только первый символ, а не весь блок текста. – Barmar

+0

Если существует несколько способов соответствия регулярного выражения (например, '% 3Exxx% 3Cxxx% 3C'), имеет ли значение, если он находит другое совпадение? – Laurel

ответ

1

Вам нужно повторно вамп части, где вы определяете количественный захват группу с одним полукоксом узором чередованием (т.е. (.)* ->(.*) и (\w|\s)* ->[\w\s]*), а также использовать ленивое согласование (.* ->.*?) в случае вам нужно получить соответствие до самого левого появления последующих шаблонов.

Использование

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

и

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

Не забудьте использовать двойные побеги в несырьевых строковых литералов и одиночные побеги в сырых строковых литералов.