Значения данных RegEx Javascript пробел - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь добавить правильный пробел для данных, которые я получаю. в настоящее время он выглядит так:

NotStarted

ReadyforPPPDReview

это код, который я использую

.replace(/([A-Z])/g, '$1')

«NotStarted» показывает правильное «Not Started» но «ReadyforPPPDReview» показывает «Readyfor PPPD Review», тогда как он должен выглядеть так: «Ready for PPPD Review»

как лучше всего справиться с обоими из них с помощью одного регулярного выражения или функции?

1 Ответ

1 голос
/ 18 июня 2020

Вам понадобится движок НЛП, чтобы справиться с этим должным образом. Вот два подхода с простым регулярным выражением, у обоих есть ограничения:

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 список слов в качестве входных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...