const regex = /CIgcCursor.*<.*>\s*(\w*)[^}]*?(?:while|for)\s*\(.*?\n.*?(\{(?>[^{}]|(?-1))*\})/g;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('CIgcCursor.*<.*>\\s*(\\w*)[^}]*?(?:while|for)\\s*\\(.*?\\n.*?(\\{(?>[^{}]|(?-1))*\\})', 'g')
const str = `Return_t
rgRoadNameChanges(Maneuver_o *pManeuverObj, rgManeuver_t *pManeuver, bool& bIsChanged)
{
Return_t Result;
Sint_t iIndex;
utSegment_t Seg;
utSegmentInfo_t SegInfo;
Uint_t nDist = 0;
DBID_t prevNavFeatureID;
DBID_t currDBID;
CIgcCursor_Sdal<DBNavFeatureAndAttrs_t> cursorFeature(true);
bIsChanged = false;
DBID_SET_NULL(prevNavFeatureID);
iIndex = pManeuver->RouteIndex;
while (nDist < 800)
{
if ((Result = utRouteGetSegment(pManeuverObj->hRoute, &Seg, iIndex)) == SDAL_FAILURE)
return NT_SUCCESS;
if ((Result = utSegmentGetInfo(&Seg, &SegInfo, NULL)) == SDAL_FAILURE)
return NT_TRACE(Result, NT_ERR_STR("rgRoadNameChanges: utSegmentGetInfo failed!"));
if ((Result = utSegmentGetDBID(&Seg, &currDBID, NULL)) == SDAL_FAILURE)
return NT_TRACE(Result, NT_ERR_STR("rgRoadNameChanges: utSegmentGetDBID failed!"));
Result = iDbGetSegNavFeatures(&currDBID, 0, cursorFeature);
if (Result > 0)
{
// Just comparing the first nav features for now. I don't know if we
// need to check all against the other list in case the order of the
// nav features changes. I'm assuming they'll stay the same order.
if (!(++cursorFeature).NoMoreRecords())
{
if (!DBID_IS_NULL(prevNavFeatureID)
&& (iGuCompareDBIDsEqual(&prevNavFeatureID, &cursorFeature->navFeature.navFeatureID, GU_COMPARE_FULL_IDS) != 0))
{
bIsChanged = true;
break;
}
utMemcpy(&prevNavFeatureID, &cursorFeature->navFeature.navFeatureID, sizeof(DBID_t));
}
}
nDist += SegInfo.length;
iIndex++;
}
}`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions