Home » U++ Library support » U++ Library : Other (not classified elsewhere) » RegExp::ReplaceGlobal() is buggy
RegExp::ReplaceGlobal() is buggy [message #51891] |
Wed, 12 June 2019 00:47  |
zsolt
Messages: 698 Registered: December 2005 Location: Budapest, Hungary
|
Contributor |
|
|
I did not investigate it, but multiple replaces are not working well:
String res8;
res8 = "ab<a>ZZ</a>";
RegExp("(<\\s*a[^>]*>(.*?)<\\s*/\\s*a>)", RegExp::UNICODE|RegExp::CASELESS)
.ReplaceGlobal(res8, "()");
CHECK_EQUAL("ab", ~res8); //this is OK
res8 = "12<a>ZZ</a>34<a>vv</a>56";
RegExp("(<\\s*a[^>]*>(.*?)<\\s*/\\s*a>)", RegExp::UNICODE|RegExp::CASELESS)
.ReplaceGlobal(res8, "()");
CHECK_EQUAL("123456", ~res8); //buggy
The ReplaceGlobal implementation is too hard for me, so I created a very simple but working method for myself to be able to use regular expressions to multiple replaces:
String RegExp::ReplaceAll(const String& s, const String& r)
{
String res;
int iPosStart;
int iPosAfterEnd;
int iFromCopyToRes = 0;
while(GlobalMatch(s)){
GetMatchPos(0, iPosStart, iPosAfterEnd);
//String matched = s.Mid(iPosStart, iPosAfterEnd-iPosStart);//debug
res << s.Mid(iFromCopyToRes, iPosStart-iFromCopyToRes);
res << r;
iFromCopyToRes = iPosAfterEnd;
}
if(iFromCopyToRes < s.GetCount()){
res << s.Mid(iFromCopyToRes, s.GetCount()-iFromCopyToRes);
}
return res;
}
Test code:
String res8;
res8 = "12<a>ZZ</a>34<a>vv</a>56";
res8 = RegExp("(<\\s*a[^>]*>(.*?)<\\s*/\\s*a>)", RegExp::UNICODE|RegExp::CASELESS)
.ReplaceAll(res8, "");
CHECK_EQUAL("123456", ~res8);
|
|
|
Goto Forum:
Current Time: Sat Feb 08 20:52:19 CET 2025
Total time taken to generate the page: 0.04137 seconds
|