[英]Regex match and increment filename (n)
我需要编写一个正则表达式来确保没有文件名冲突。
所以我给用户保存为某个名称的能力,然后我针对数组检查字符串,如果发生冲突,我遵循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
该字符串应该与结束 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)
显然,上面仍然缺少的是检查文件名是否已经存在于文件名数组中,这可以通过使用fileNamesArray.includes(fileName)
轻松实现
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.