Regex - Найти пробелы в группе захвата - PullRequest
1 голос
/ 21 января 2020

Мы используем некоторые структуры имен файлов, как пользователи должны сохранять файлы.

У меня есть огромный список всех наших файлов в Excel, и я должен проверить некоторые имена файлов.

В кратком объяснении имя файла начинается с номера детали. Номер детали содержит «группы», разделенные дефисом.

Основная проблема заключается в том, что пользователи иногда используют пробелы (случайным образом) с дефисами для разделения групп.

Я должен отметить имена файлов в списке выглядят так: -корректно -подобно, но неправильно -не совпадает

Аналог означает, что порядок групп правильный, но разделение групп не только дефис (-), но и объединенный с пробелом (ами): ' - ' или '- ' или ' -' или '- ' et c ..

Я написал макрос регулярных выражений в VBA. Это хорошо работает, но я придерживался "подобного" шаблона.

Вот упрощенная версия одной структуры в регулярном выражении:

^(\d{4}-\d{2}(?:-\d{3})?-[A-Z]\d{3}-[A-Z])(?: - )(.*)

В этом случае интересная часть - первая группа захвата, номер части. Как видите, в первой группе захвата есть группа без захвата, которая является необязательной. Две группы захвата (номер детали и описание) разделяются с помощью '-'.

Примеры для правильного имени файла:

1111-22-333-A444-B - DESCR.EXT

1111-22-A444-B - DESCR.EXT

Примеры для похожего, но неправильного имени файла:

1111-22 -333-A444-B - DESCR.EXT

1111-22- A444-B - DESCR.EXT

1111 -22-333-A444-B - DESCR.EXT

1111  -22 - A444-  B - DESCR.EXT

1111 - 22 -  A444 - B - DESCR.EXT

Примеры несоответствующего имени файла:

1111-22-333-A444 - DESCR.EXT

1111-22-B - DESCR.EXT

1111-22-333-A444-BDESCR.EXT

1111-22 - DESCR.EXT

1111-22-33-444-B - DESCR.EXT

1111-22-444-B - DESCR.EXT

Я могу пометить правильные и несоответствующие значения с помощью шаблона выше, но я не знаю, как можно изменить, чтобы проверить, что есть " аналогичный"? Я пытался найти решение здесь и в Google, но не нашел: /

Спасибо

1 Ответ

1 голос
/ 22 января 2020

Измените - и (?: - ) на \s*-\s*, чтобы было принято любое произвольное количество начальных и / или конечных пробелов, включая ни одного (только дефис). (Я также удалил включающий (?:…), поскольку он не использовался.)

В этой интерактивной демонстрации у меня есть две версии вашего регулярного выражения. Один для правильности (регулярное выражение в вопросе) и один для подобия, который более раскован относительно расстояния с моим предложением выше. Допустимые записи окрашены в зеленый цвет, аналогичные записи - в красный. Вы можете играть с регулярными выражениями и перезапускать по мере необходимости.

function check(elem) {
  let next = elem.nextElementSibling;
  let okay = elem.innerHTML.match(document.getElementById("okay").value);
  let sim = elem.innerHTML.match(document.getElementById("sim").value);
  if (okay) {
    next.innerHTML = " → 1=[" + okay[1] + "] 2=[" + okay[2] + "]";
    next.className = "";
  } else if (sim) {
    next.innerHTML = " → 1=[" + sim[1] + "] 2=[" + sim[2] + "]";
    next.className = "similar";
  } else {
    next.innerHTML = "";
  }
}

function go() {
  document.querySelectorAll("li pre").forEach(item => check(item));
}
li { list-style:none; }
pre { display:inline-block; }
pre, ul, li { margin-top:0; margin-bottom:0 }
input[type="text"] { width:96%; font-family:monospace; }
input { display:block; }
pre + b { color:#080; font-family:monospace; }
pre + b.similar { color:#800; }
Valid: 
Similar: 


Correct

1111-22-333-A444-B - DESCR.EXT
1111-22-A444-B - DESCR.EXT
Аналогично, но неверное имя файла
1111-22 -333-A444-B - DESCR.EXT
1111-22- A444-B - DESCR.EXT
1111 -22-333-A444-B - DESCR.EXT
1111  -22 - A444-  B - DESCR.EXT
1111-22-333-A444-B - DESCR.EXT
1111 - 22 -  A444 - B - DESCR.EXT
Несоответствующее имя файла
1111-22-333-A444 - DESCR.EXT
1111-22-B - DESCR.EXT
1111-22-333-A444-BDESCR.EXT
1111-22 - DESCR.EXT
1111-22-33-444-B - DESCR.EXT
1111-22-444-B - DESCR.EXT

Как вы можете видеть, второе-последнее "похожее" имя файла соответствует вашему исходному регулярному выражению. Я не уверен, что там было задумано.

...