Соответствие последнему лучшему слову с использованием регулярного выражения js - PullRequest
0 голосов
/ 03 августа 2020

У меня есть регулярное выражение для сопоставления текста в скобках. Например, регулярное выражение https://regex101.com/r/TvweUj/3

/\b(\w)[-'\w]* (?:[-",/\\*&'\w]* ){1,}\(\1[A-Z]{1,}\)/gi

соответствует MIDI. Определение класса USB-устройства для MIDI-устройств передает Musi c Instrument Digital Interface (MIDI). вместо сопоставления только последних 4 слов Musi c Цифровой интерфейс инструмента

Как изменить регулярное выражение, чтобы оно соответствовало недавнему совпадению, вместо MIDI USB Dev *****

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать 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);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...