正则表达式匹配并增加文件名(n)

时间:2019-04-09 17:55:35

标签: javascript regex

我需要编写一个正则表达式以确保没有文件名冲突。

因此,我为用户提供了另存为某些名称的功能,然后针对数组检查字符串,如果发生冲突,则遵循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 个答案:

答案 0 :(得分:3)

该字符串应以space(one or more digits)endOfString 结尾,这样您可以:

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

\d+周围的其他方括号(捕获组)用于提取数字:

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

匹配

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)  

显然,上面仍然缺少的是检查该文件名是否已经存在于 filenames 数组中,这可以通过使用fileNamesArray.includes(fileName)

轻松实现