const regex = /(<mark[^>]*>.*?<\/mark>)|(( |.)((?:#|#)(?:[a-z0-9_\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0100-\u024f\u0253-\u0254\u0256-\u0257\u{0259}\u{025b}\u{0263}\u{0268}\u{026f}\u{0272}\u{0289}\u{028b}\u{02bb}\u0300-\u036f\u1e00-\u1eff\u0400-\u04ff\u0500-\u0527\u2de0-\u2dff\ua640-\ua69f\u0591-\u05bf\u05c1-\u05c2\u05c4-\u05c5\u{05c7}\u05d0-\u05ea\u05f0-\u05f4\ufb12-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\u{fb3e}\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufb4f\u0610-\u061a\u0620-\u065f\u066e-\u06d3\u06d5-\u06dc\u06de-\u06e8\u06ea-\u06ef\u06fa-\u06fc\u{06ff}\u0750-\u077f\u{08a0}\u08a2-\u08ac\u08e4-\u08fe\ufb50-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\u200c-\u200c\u0e01-\u0e3a\u0e40-\u0e4e\u1100-\u11ff\u3130-\u3185\ua960-\ua97f\uac00-\ud7af\ud7b0-\ud7ff\uffa1-\uffdc\u30a1-\u30fa\u30fc-\u30fe\uff66-\uff9f\uff10-\uff19\uff21-\uff3a\uff41-\uff5a\u3041-\u3096\u3099-\u309e\u3400-\u4dbf\u4e00-\u9fff\u{3003}\u{3005}\u{303b}]*[a-z_\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0100-\u024f\u0253-\u0254\u0256-\u0257\u{0259}\u{025b}\u{0263}\u{0268}\u{026f}\u{0272}\u{0289}\u{028b}\u{02bb}\u0300-\u036f\u1e00-\u1eff\u0400-\u04ff\u0500-\u0527\u2de0-\u2dff\ua640-\ua69f\u0591-\u05bf\u05c1-\u05c2\u05c4-\u05c5\u{05c7}\u05d0-\u05ea\u05f0-\u05f4\ufb12-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\u{fb3e}\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufb4f\u0610-\u061a\u0620-\u065f\u066e-\u06d3\u06d5-\u06dc\u06de-\u06e8\u06ea-\u06ef\u06fa-\u06fc\u{06ff}\u0750-\u077f\u{08a0}\u08a2-\u08ac\u08e4-\u08fe\ufb50-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\u200c-\u200c\u0e01-\u0e3a\u0e40-\u0e4e\u1100-\u11ff\u3130-\u3185\ua960-\ua97f\uac00-\ud7af\ud7b0-\ud7ff\uffa1-\uffdc\u30a1-\u30fa\u30fc-\u30fe\uff66-\uff9f\uff10-\uff19\uff21-\uff3a\uff41-\uff5a\u3041-\u3096\u3099-\u309e\u3400-\u4dbf\u4e00-\u9fff\u{3003}\u{3005}\u{303b}][a-z0-9_\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0100-\u024f\u0253-\u0254\u0256-\u0257\u{0259}\u{025b}\u{0263}\u{0268}\u{026f}\u{0272}\u{0289}\u{028b}\u{02bb}\u0300-\u036f\u1e00-\u1eff\u0400-\u04ff\u0500-\u0527\u2de0-\u2dff\ua640-\ua69f\u0591-\u05bf\u05c1-\u05c2\u05c4-\u05c5\u{05c7}\u05d0-\u05ea\u05f0-\u05f4\ufb12-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\u{fb3e}\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufb4f\u0610-\u061a\u0620-\u065f\u066e-\u06d3\u06d5-\u06dc\u06de-\u06e8\u06ea-\u06ef\u06fa-\u06fc\u{06ff}\u0750-\u077f\u{08a0}\u08a2-\u08ac\u08e4-\u08fe\ufb50-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\u200c-\u200c\u0e01-\u0e3a\u0e40-\u0e4e\u1100-\u11ff\u3130-\u3185\ua960-\ua97f\uac00-\ud7af\ud7b0-\ud7ff\uffa1-\uffdc\u30a1-\u30fa\u30fc-\u30fe\uff66-\uff9f\uff10-\uff19\uff21-\uff3a\uff41-\uff5a\u3041-\u3096\u3099-\u309e\u3400-\u4dbf\u4e00-\u9fff\u{3003}\u{3005}\u{303b}]*)))(( |\W)|$)/gi;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(<mark[^>]*>.*?<\\\/mark>)|(( |.)((?:#|#)(?:[a-z0-9_\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253-\\u0254\\u0256-\\u0257\\u{0259}\\u{025b}\\u{0263}\\u{0268}\\u{026f}\\u{0272}\\u{0289}\\u{028b}\\u{02bb}\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u{05c7}\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb12-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\u{fb3e}\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u{06ff}\\u0750-\\u077f\\u{08a0}\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c-\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\ua960-\\ua97f\\uac00-\\ud7af\\ud7b0-\\ud7ff\\uffa1-\\uffdc\\u30a1-\\u30fa\\u30fc-\\u30fe\\uff66-\\uff9f\\uff10-\\uff19\\uff21-\\uff3a\\uff41-\\uff5a\\u3041-\\u3096\\u3099-\\u309e\\u3400-\\u4dbf\\u4e00-\\u9fff\\u{3003}\\u{3005}\\u{303b}]*[a-z_\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253-\\u0254\\u0256-\\u0257\\u{0259}\\u{025b}\\u{0263}\\u{0268}\\u{026f}\\u{0272}\\u{0289}\\u{028b}\\u{02bb}\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u{05c7}\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb12-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\u{fb3e}\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u{06ff}\\u0750-\\u077f\\u{08a0}\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c-\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\ua960-\\ua97f\\uac00-\\ud7af\\ud7b0-\\ud7ff\\uffa1-\\uffdc\\u30a1-\\u30fa\\u30fc-\\u30fe\\uff66-\\uff9f\\uff10-\\uff19\\uff21-\\uff3a\\uff41-\\uff5a\\u3041-\\u3096\\u3099-\\u309e\\u3400-\\u4dbf\\u4e00-\\u9fff\\u{3003}\\u{3005}\\u{303b}][a-z0-9_\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253-\\u0254\\u0256-\\u0257\\u{0259}\\u{025b}\\u{0263}\\u{0268}\\u{026f}\\u{0272}\\u{0289}\\u{028b}\\u{02bb}\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u{05c7}\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb12-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\u{fb3e}\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u{06ff}\\u0750-\\u077f\\u{08a0}\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c-\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\ua960-\\ua97f\\uac00-\\ud7af\\ud7b0-\\ud7ff\\uffa1-\\uffdc\\u30a1-\\u30fa\\u30fc-\\u30fe\\uff66-\\uff9f\\uff10-\\uff19\\uff21-\\uff3a\\uff41-\\uff5a\\u3041-\\u3096\\u3099-\\u309e\\u3400-\\u4dbf\\u4e00-\\u9fff\\u{3003}\\u{3005}\\u{303b}]*)))(( |\\W)|$)', 'gi')
const str = `<p>laboris nisi ut aliquip ex ea commodo</p><p> #adf -sdaf</p><p>dsf w#home</p>
<p>Lorem <mark contenteditable="false">#ipsum</mark> dolor sit amet, </p><p>consectetur adipisicing elit, sed do </p><p>eiusmod</p><p>tempor incididunt ut <mark contenteditable="false">#labore</mark> et </p><p>#dolore </p><p>magna aliqua. Ut enim ad minim </p><p>veniam,</p><p>quis @nostrud exercitation ul <mark contenteditable="false">#lamco</mark> </p>#else`;
const subst = `$1$3<mark contenteditable=\"false\">$4</mark>$5`;
// 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