const regex = /(\/\*[\s\S]*?\*\/|\/\/.*?$)|(?:\b(?=[A-Za-z][A-Za-z\d]*(?:_[A-Za-z\d]++)+\b)|\G(?<!\b))([A-Za-z\d])([A-Za-z\d]*)(?:_|\b)/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(\\\/\\*[\\s\\S]*?\\*\\\/|\\\/\\\/.*?$)|(?:\\b(?=[A-Za-z][A-Za-z\\d]*(?:_[A-Za-z\\d]++)+\\b)|\\G(?<!\\b))([A-Za-z\\d])([A-Za-z\\d]*)(?:_|\\b)', 'gm')
const str = `_here _is an_EX4mple, thisisnot_, BUT_th1s_1s, also_not_, y_3_s_sir
/* Ok, we are inside a comment so_this_does_not_count, nor_this
and_def_not_this
or_this */ outside_is_fair_game
some other_stuff here /* another_multiline_comment */
no_double__underscore but_yes_this not__this
this_comes_before // a single_line comment
and stuff_aFTER_tHE_CoMmEnT, except 1cannot_start_with_a_number, and finally_
not_4cr0ss_mult1p13_l1nes`;
const subst = `$1\U$2\L$3\E`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
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