MCPcopy Create free account
hub / github.com/RedisGraph/RedisGraph / AR_REPLACEREGEX

Function AR_REPLACEREGEX

src/arithmetic/string_funcs/string_funcs.c:405–469  ·  view source on GitHub ↗

given a string and a regular expression, return a string after replacing each regex match with a given replacement. string.replaceRegEx(str, regex, replacement) -> string

Source from the content-addressed store, hash-verified

403// return a string after replacing each regex match with a given replacement.
404// string.replaceRegEx(str, regex, replacement) -> string
405SIValue AR_REPLACEREGEX(SIValue *argv, int argc, void *private_data) {
406 if(SI_TYPE(argv[0]) == T_NULL || SI_TYPE(argv[1]) == T_NULL) {
407 return SI_NullVal();
408 }
409
410 char *replacement = "";
411 const char *str = argv[0].stringval;
412 const char *regex_str = argv[1].stringval;
413
414 if(argc == 3) {
415 if(SI_TYPE(argv[2]) == T_NULL) {
416 return SI_NullVal();
417 }
418
419 replacement = argv[2].stringval;
420 }
421
422 regex_t *regex;
423 OnigErrorInfo einfo;
424 OnigRegion *region = onig_region_new();
425
426 int rv = onig_new(&regex, (const UChar *)regex_str,
427 (const UChar *)(regex_str + strlen(regex_str)), ONIG_OPTION_DEFAULT,
428 ONIG_ENCODING_UTF8, ONIG_SYNTAX_JAVA, &einfo);
429 if(rv != ONIG_NORMAL) {
430 char s[ONIG_MAX_ERROR_MESSAGE_LEN];
431 onig_error_code_to_str((UChar* )s, rv, &einfo);
432 ErrorCtx_SetError("Invalid regex, err=%s", s);
433 onig_free(regex);
434 onig_region_free(region, 1);
435 return SI_NullVal();
436 }
437
438 replace_regex_scan_cb_args args = {
439 .res = NULL,
440 .res_len = 0,
441 .str = str,
442 .str_ind = 0,
443 .replacement = replacement,
444 .replacement_len = strlen(replacement)
445 };
446
447 rv = onig_scan(regex, (const UChar *)str,
448 (const UChar *)(str + strlen(str)), region, ONIG_OPTION_DEFAULT,
449 replace_regex_scan_cb, &args);
450 if(rv < 0) {
451 char s[ONIG_MAX_ERROR_MESSAGE_LEN];
452 onig_error_code_to_str((OnigUChar* )s, rv);
453 ErrorCtx_SetError("Invalid regex, err=%s", s);
454 onig_free(regex);
455 onig_region_free(region, 1);
456 return SI_NullVal();
457 }
458
459 onig_free(regex);
460 onig_region_free(region, 1);
461
462 // copy the remaining string

Callers

nothing calls this directly

Calls 4

SI_NullValFunction · 0.85
ErrorCtx_SetErrorFunction · 0.85
rm_reallocFunction · 0.85
SI_TransferStringValFunction · 0.85

Tested by

no test coverage detected