正则表达式从文件名末尾删除版本历史编号

时间:2014-09-15 22:29:15

标签: regex

我对正则表达式相当新,我试图编写一个表达式,从文件重命名器中使用的一大组文件名末尾删除版本历史记录编号。
这些是我试图删除的各种版本的历史记录:

1.0 2.1a 3.5b v4.6 v5.7a v6.8b V7.9 V8.0a V9.1b And any of the previous forms 
can be enclosed in () [] or {} Maximum 5 Character + 2 brackets.

示例后跟所需结果:

File-Name(v1.0).txt - File-Name.txt
fn1[V1.1].txt - fn1.txt 
FN2(v1.2a).txt -  FN2.txt
filename1.3.txt - filename.txt
file(name)1.4b.txt - file(name).txt
[file]name-V1.5.txt - [file]name-.txt
Author - [book 01](1.6).txt - Author - [book 01].txt

这是我为删除它们而写的表达方式:

\s?([\[\(\{]?[vV]?[1-9]\.[0-9][ab]?[\]\)\}]?)\.txt 
REPLACE: .txt

我不希望它删除括号中大于5个字符的任何内容,例如:

Author - [Book 1.0].txt   

不应该改变。

我想让结束括号取决于开口括号的位置,它们最多可包含5个字符,其中必须包含"。" 两个数字之间。

必须忽略的边缘情况的其他示例:

FN-volume1.txt 
FN[Vol3.0].txt
FileName - book 2.txt 
编辑:通过删除<最终使它在JS中工作。符号:

s?([\[({][vV]?\d+\.\d+[ab]?[\])}]|(?!([\[({]))[vV]?\d+\.\d+[ab]?(?![\])}]))(?=\W?\.\w{3})

1 个答案:

答案 0 :(得分:1)

使用首先尝试将与两个括号匹配的替换,然后不带括号(使用负向外观)有效地使可选 - 即两者都缺席:

\s?([\[({][vV]?\d+\.\d+[ab]?[\])}]|(?<![\[({])[vV]?\d+\.\d+[ab]?(?![\])}]))(?=\W?\.\w{3})

请参阅live demo

此正则表达式仅与版本匹配,因此请替换为空白。

我还使文件扩展名变得灵活 - 处理了所有文件类型(如果这是不需要的,请将\w{3}替换为txt)。

版本号的正则表达式已经简化,并且删除了字符类中不必要的转义。

另请注意,您的方法稍微天真,因为括号类型不必匹配,例如(v1.2]匹配。如果这不可能,请不要担心,但如果是,则需要为每个支架类型对单独更换。