Это должно работать в Javascript:
var newString = oldString.replace(/([^_].*?)_(?=[^_|^\s])/g,"$1 ");
Редактировать: если в строке уже есть пробелы, возможно, потребуется что-то вроде этого:
var newString = oldString.replace(/([^_|\s].*?)_(?=[^_|^s])/g,"$1 ");
Какие-нибудь другие крайние случаи я забыл? :) О да, еще один крайний случай. Оставьте подчеркивание конца, если за ним следует пробел (например, перевод строки, конец строки и т. Д.).
edit: альтернативное решение, если число подчеркиваний между словами> 1
var arrayString = oldString.replace(/^(_+)(.*?)(_+)$/g,"$1;$2;$3");
var a = arrayString.split(";");
var newString = a[0]+a[1].replace(/_/g," ")+a[2];