Вы можете использовать 4 группы захвата с положительным просмотром вперед, утверждая 4 обратные ссылки для соответствия символам верхнего регистра между круглыми скобками:
\b([A-Z])\w+ ([A-Z])\w+ ([A-Z])\w+ ([A-Z])\w+(?= \(\1\2\3\4\))
Regex demo
Вместо используя только \w
, вы можете использовать классы символов, которые вы используете в вопросе, например [-",/\\*&'\w]*
Более широким шаблоном может быть повторение символа верхнего регистра, за которым следует более 1 символа слова \w+
(или используйте \w*
, чтобы повторить символы из 0+ слов) и подтвердите, что далее следует только символы верхнего регистра между скобками.
\b[A-Z]\w+(?: [A-Z]\w+)*(?= \([A-Z]+\))
Regex demo
Если количество символов является переменной, которую вы хотите сопоставить между круглыми скобками, и они должны совпадать с количеством слов до этого, вы можете использовать 2 группы захвата и сравнить количество разделенных слов с количеством символов в верхнем регистре в скобках.
let pattern = /\b([A-Z][a-z]*(?: [A-Z][a-z]*)*) \(([A-Z]+)\)/;
let compare = (ar1, ar2) =>
ar1.length === ar2.length && ar1.every(
(value, index) => value === ar2[index].charAt(0)
);
[
"transmits Music Instrument Digital Interface (MIDI).",
"transmits Music Instrument Digital Interface (MADI).",
"transmits Music Instrument Digital Interface (MID)."
].forEach(s => {
let m = s.match(pattern);
let res = compare(m[2].split(''), m[1].split(' ')) ? "Ok -> " : "Not ok -> ";
console.log(res + s);
})