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
| 403 | // return a string after replacing each regex match with a given replacement. |
| 404 | // string.replaceRegEx(str, regex, replacement) -> string |
| 405 | SIValue 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(®ex, (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 |
nothing calls this directly
no test coverage detected