我需要编写一个正则表达式以确保没有文件名冲突。
因此,我为用户提供了另存为某些名称的功能,然后针对数组检查字符串,如果发生冲突,则遵循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
答案 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)