Вам понадобится движок НЛП, чтобы справиться с этим должным образом. Вот два подхода с простым регулярным выражением, у обоих есть ограничения:
1. Использовать список стоп-слов
Мы вслепую добавляем пробелы до и после стоп-слов:
var str = 'NotStarted, ReadyforPPPDReview';
var wordList = 'and, for, in, on, not, review, the'; // stop words
var wordListRe = new RegExp('(' + wordList.replace(/, */g, '|') + ')', 'gi');
var result1 = str
.replace(wordListRe, ' $1 ') // add space before and after stop words
.replace(/([a-z])([A-Z])/g, '$1 $2') // add space between lower case and upper case chars
.replace(/ +/g, ' ') // remove excessive spaces
.trim(); // remove spaces at start and end
console.log('str: ' + str);
console.log('result1: ' + result1);
Как вы понимаете, подход стоп-слов имеет некоторые серьезные ограничения. Например, слова formula input
приведут к for mula in put
.
1. Используйте таблицу сопоставления
В таблице сопоставления перечислены слова, которые необходимо выделить (без наркотиков), как в этом фрагменте кода:
var str = 'NotStarted, ReadyforPPPDReview';
var spaceWordMap = {
NotStarted: 'Not Started',
Readyfor: 'Ready for',
PPPDReview: 'PPPD Review'
// add more as needed
};
var spaceWordMapRe = new RegExp('(' + Object.keys(spaceWordMap).join('|') + ')', 'gi');
var result2 = str
.replace(spaceWordMapRe, function(m, p1) { // m: matched snippet, p1: first group
return spaceWordMap[p1] // replace key in spaceWordMap with its value
})
.replace(/([a-z])([A-Z])/g, '$1 $2') // add space between lower case and upper case chars
.replace(/ +/g, ' ') // remove excessive spaces
.trim(); // remove spaces at start and end
console.log('str: ' + str);
console.log('result2: ' + result2);
Этот подход подходит, если у вас есть детерминированный c список слов в качестве входных.