Вот одна возможность.Он возвращает объект, ключи которого являются аббревиатурами, а значения - совпадающими предыдущими словами (без какой-либо попытки нормализовать их для использования заглавных букв).
const findAcronyms = (str) => {
const words = str.split(/\s+/)
return words.reduce((all, word, i) => {
const isCandidate = word.match(/\([A-Z]+\)/)
if (!isCandidate) {return all}
const letters = word.split('').slice(1, -1)
const acro = letters.join('')
if (i - letters.length < 0) {return all}
if (words.slice(i - letters.length, i)
.map(s => s[0]).join('')
.toLowerCase() !== acro.toLowerCase()) {
return all
}
return {
...all,
[acro]: words.slice(i - letters.length, i).join(' ')
}
}, {})
}
const str = 'bla bla radar cross section (RCS) but this one (IN) is not And This One (ATO) is'
console.log(findAcronyms(str)) //~>
// {
// RCS: "radar cross section",
// ATO: "And This One"
// }
Обратите внимание, что "IN"
не включен в результат, так как он не соответствует предыдущему тексту.
Если вы просто хотите, чтобы действительные аббревиатурыбез того, что они обозначают, вы можете изменить возвращаемое значение как массив или просто запустить Object.keys
для этого результата.