Простейшим регулярным выражением, совпадающим только с единичными вхождениями #x;
, будет использование утверждения lookehind и lookahead.
/(?<!#x;)#x;(?!#x;)/
Однако Javascript не поддерживает lookbehinds, поэтому вы можете попробовать этот обходной путь, используя тольковместо того, чтобы смотреть вперед:
/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/
Полный пример:
> s = 'Some sentence #x;#x;#x; with #x;#x; some #x; words #x; need in replacing.'
> s = s.replace(/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/g, '$1#y;')
"Some sentence #x;#x;#x; with #x;#x; some #y; words #y; need in replacing."