Вы можете попробовать следующее:
/\b(\w)[-'\w]* (?:[-'\w]* ){1,}\(\1[A-Z]{1,}\)/gi
ОБНОВЛЕНИЕ
Как @ ikegami прокомментировал , это неаккуратное регулярное выражение соответствует также таким вещам, как Bring some drinks (beer)
и Bring something to put on the grill (BBQ)
. Я думаю, что эти случаи можно отфильтровать, используя правильный код JavaScript после сопоставления регулярных выражений. Возможно, в случае Bring some drinks (beer)
мы сможем обнаружить его, используя тот факт, что (beer)
не имеет прописных букв. В случае Bring something to put on the grill (BBQ)
мы можем обнаружить это, используя тот факт, что нет совпадающих начальных букв для вторых B
и Q
в Bring something to put on the grill
.
ОБНОВЛЕНИЕ 2
Когда мы сопоставляем следующую строку с помощью регулярного выражения выше:
We need to use technologies from Natural Language Processing (NLP).
Соответствует "need to use technologies from Natural Language Processing (NLP)
", а не" Natural Language Processing (NLP)
". Этими проблемами тоже надо заняться.
ОБНОВЛЕНИЕ 3
Следующее регулярное выражение соответствует акронимам длиной от 2 до 5 и не имеет проблем, упомянутых выше. И я думаю, что его можно довольно легко расширить для поддержки большей длины, как вы хотите:
/\b(\w)\S* (?:(?:by |of )?(\w)\S* (?:(?:by |of )?(\w)\S* (?:(?:by |of )?(\w)\S* (?:(?:by |of )?(\w)\S* )?)?)?) *\(\1\2\3\4\5\)/gi