const regex = / \$\K\s*((?:[^<$\s]+|(?!\s+[<$])\s+)*)\s*(?=(?:<(*ACCEPT)|\$|$)(*SKIP)(*F))
|(?!^)<\K\s*((?:[^<$\s]+|(?!\s+[<$])\s+)*)\s*(\$?)
|[^$]+(*SKIP)(*F)/g;
// Alternative syntax using RegExp constructor
// const regex = new RegExp(' \\$\\K\\s*((?:[^<$\\s]+|(?!\\s+[<$])\\s+)*)\\s*(?=(?:<(*ACCEPT)|\\$|$)(*SKIP)(*F))
|(?!^)<\\K\\s*((?:[^<$\\s]+|(?!\\s+[<$])\\s+)*)\\s*(\\$?)
|[^$]+(*SKIP)(*F)', 'g')
const str = `random < test
nope \$ foo \$ bar < a \$ qux < biz\$fx<hk\$
\$foo<bar<baz\$ foo buh<bar<baz\$
\$ foo \$ a < z \$ a <b <z\$
`;
const subst = ` \1\2 \3`;
// 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