2016-11-23 5 views
1

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

Пример:
a.m.a. архивы общей психиатрии -> А.М.А. Архив общей психиатрии

a.m.a. архивы неврологии -> А.М.А. Архив неврологии

a.m.a. архивы неврологии и психиатрии -> А.М.А. Архивы неврологии и психиатрии

Вот, Что я пытался до сих пор:

Но не везло до сих пор.

function transform(str) { 
 
    let smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?\.?|via)$/i; 
 
    return str.replace(/[A-Za-z0-9\u00C0-\u00FF]+[^\'\s-]*/g, function(match, index, title) { 
 
    if (index > 0 && index + match.length !== title.length && 
 
     match.search(smallWords) > -1 && title.charAt(index - 2) !== ":" && 
 
     (title.charAt(index + match.length) !== '-' || title.charAt(index - 1) === '-') && 
 
     (title.charAt(index + match.length) !== "'" || title.charAt(index - 1) === "'") && 
 
     title.charAt(index - 1).search(/[^\s-]/) < 0) { 
 
     return match.toLowerCase(); 
 
    } 
 
    if (match.substr(1).search(/[A-Z]|\../) > -1) { 
 
     return match; 
 
    } 
 
    return match.charAt(0).toUpperCase() + match.substr(1); 
 
    }); 
 
} 
 

 
function showRes(str) { 
 
    document.write(transform(str)); 
 
}
<button onclick="showRes('a.m.a. archives of neurology')">convert</button>

+1

@downvoter - Уход, чтобы указать вескую причину! – Rayon

+2

Разделите строку пробелами, разделите эти строки на точки, а затем замените каждую букву индексом [0] в верхнем регистре. Нет необходимости в регулярном выражении. – Seth

ответ

4

Я полностью переписан функции:

function transform(str) { 
 
    let smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?\.?|via)$/i; 
 
    let words = str.split(' ');  // Get me an array of separate words 
 

 
    words = words.map(function(word, index) { 
 
    if (index > 0 && ~word.search(smallWords)) 
 
     return word;     // If it's a small word, don't change it. 
 
    
 
    if (~word.lastIndexOf('.', 1)) // If it contains periods, it's an abbreviation: Uppercase. 
 
     return word.toUpperCase(); // lastIndexOf to ignore the last character. 
 

 
    // Capitalize the fist letter if it's not a small word or abbreviation. 
 
    return word.charAt(0).toUpperCase() + word.substr(1); 
 
    }); 
 
    
 
    return words.join(' '); 
 
} 
 

 
console.log(transform('a.m.a. archives of neurology')); 
 
console.log(transform('a.m.a. archives of neurology.')); 
 
console.log(transform('a case study. instit. Quar.'));

+1

@ WiktorStribiżew: Хорошая точка. Я добавил что-то, чтобы игнорировать периоды ожидания – Cerbrus

+1

Это самый элегантный ответ! Работает как шарм! Спасибо @Cerbrus –

+0

Один вопрос: он не работает с «ситуационным исследованием». Instit. Quar. '' A' остается внизу –

Смежные вопросы