Разделить строку на слова CamelCase, а также заглавные аббревиатуры - PullRequest
1 голос
/ 27 февраля 2020

Учитывая строку, содержащую CamelCase, а также прописные аббревиатуры, например, «ManualABCTask»;

Как ее можно разбить на строку с пробелом между всеми словами и аббревиатурами менее многословно?

У меня был следующий процесс:

let initial = 'ManualABCTask'
//Split on single upper case followed by any number of lower case:
.split(/(['A-Z'][a-z]*)/g)
//the returned array includes empty string entries e.g. ["", "", "Manual", "A", "", "B", "", "C","", "Task", ""] so remove these:
.filter(x => x != '');

//When joining the array, the acronymn uppercase single letters have a space e.g. 'Manual A B C Task' so instead, reduce and add space only if array entry has more than one character
 let word = initial.reduce((prevVal,currVal) => {
    return  (currVal.length == 1) ? prevVal + currVal  : prevVal + ' ' + currVal + ' ';
}, '');

Это выполняет работу с нужными комбинациями, например:

  • 'ManualABCTask' => 'Manual AB C Task'
  • 'ABCManualTask' => 'AB C Ручное задание'
  • 'ABCManualDEFTask' => 'AB C Ручное задание DEF'

Но это было много кода для выполненной работы, и, конечно же, его можно было обработать в начальном регулярном выражении.

Я экспериментировал, когда писал вопрос, и с настройкой регулярного выражения получил его в одну строку, большое улучшение! Так что в любом случае отправляю сообщения с решением.

Мой регулярный пользователь знает, как это не здорово, так что это может быть улучшено до сих пор.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Я почти ничего не знаю о JavaScript, но у меня было bash:

let initial = 'ManualABCTask'
initial = initial.replace(/([A-Z][a-z]+)/g, ' $1 ').trim();
1 голос
/ 27 февраля 2020

Есть 2 группы: начиная с заглавной буквы со следующими строчными буквами и начиная с заглавной буквы до следующей строчной буквы:

find = new RegExp(
    "(" +
    "[A-Z][a-z]+" +  // Group starting from head letter with following lowercases
    "|" +
    "[A-Z]+(?![a-z])" +  // Group with head letters until next letter isn't lowercase:
    ")",
    "g"
)
initial = 'ManualABCTask'.split(find)
0 голосов
/ 27 февраля 2020

Как упомянуто в посте, изменено для обработки в регулярном выражении:

  initial = 'ManualABCTask'.split(/(['A-Z']{2,99})(['A-Z'][a-z]*)/g).join(' ');

Сгруппируйте любые одновременные верхние символы длиной от 2 до 99, чтобы получить сокращения, и любой отдельный верхний символ, за которым следует любое количество нижних чтобы получить другие слова. Присоединяйся с пробелом.

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