Соответствие регулярному выражению и увеличение имени файла (n) - PullRequest
3 голосов
/ 09 апреля 2019

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

Таким образом, я даю пользователю возможность сохранить как какое-то имя, а затем проверяю строку по массиву, и, если происходит столкновение, я следую парадигме сохранения Windows.

Если вы сохраните test, он будет сохранен как test, если вы попытаетесь сохранить test снова, он станет test (1). Теперь я хочу посмотреть на это (1) так

Условия

всегда будет начинаться с (, затем с количеством символов N 0-9 и заканчивается ).

Как я могу искать (1) или (169) с регулярным выражением?
Я не уверен, какое именно количество символов я могу написать в этом регулярном выражении. Кроме того, как вторичное регулярное выражение, как бы я имел то же самое, но также искать то же регулярное выражение, но с пробелом перед (?

Попытка:

То, что я придумал const regEx = RegExp(/(?:\()[0-9*](?:\))/), однако это работает только для (1), но не (11), и я не знаю, как искать пробел до (

Это, вероятно, очень легко, но я не очень разбираюсь в регулярных выражениях.

Образцы строк, которые не должны работать

// Should work:
test (1)
test (594)
test (54)

// Shouldn't work
test (1
test 594)
test 54

1 Ответ

3 голосов
/ 09 апреля 2019

Строка должна оканчиваться на space(one or more digits)endOfString, чтобы вы могли:

\s\((\d+)\)$

дополнительные скобки ( Группа захвата ) около \d+ предназначены для извлечения числа:

https://regex101.com/r/5OFix0/1

Matching

const sample = `test (0)
test (12)
test()
test(1)
test 1
ends with space (123) `;


sample.split('\n').forEach(fileName => {

  const m = /\s\((\d+)\)$/.exec(fileName);
	
  if (m && m[1]) {       // if is incremented, AKA "fileName (n)"
    console.log(m[1]); // do your stuff here using m[1] string
  }

});

Подбор и замена

Вот пример с примером имени файла (без расширений):

/**
 * Detect " (n)" suffixed string. Return "n"
 * @param {String} name
 * @return {String|null} The integer string or null
 */
const isFilenameIncremented = name => {
  const m = /\s\((\d+)\)$/.exec(name);
  return m && m[1];
};

/**
 * Increment unsuffixed or " (n)" suffixed string
 * @dependency {Function} isFilenameIncremented
 * @param {String} name
 * @return {String} The " ((n|0)+1)" suffixed filename
 */
const incrementFilename = name => {
  const isInc = isFilenameIncremented(name);
  return isInc ? name.replace(/\d+(?=\)$)/, m => (+m)+1) : `${name} (1)`;
}


const sample = `test (0)
test (12)
test()
test(1)
test 1
ends with space (123) `;

sample.split('\n').forEach(filename => {
  const fileNameIncr = incrementFilename(filename);
  console.log( fileNameIncr )
});

Который должен увеличивать только два первых имени файла (от 0 до 1 и от 12 до 13) и добавлять (1) ко всем остальным, что приводит к следующему:

test (1)  
test (13)  
test() (1)  
test(1) (1)  
test 1 (1)  
ends with space (123)  (1)  

Очевидно, что выше по-прежнему не хватает проверки того, существует ли это имя файла в массиве имен файлов , что может быть легко достигнуто с помощью fileNamesArray.includes(fileName)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...