我对正则表达式相当新,我试图编写一个表达式,从文件重命名器中使用的一大组文件名末尾删除版本历史记录编号。
这些是我试图删除的各种版本的历史记录:
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})
答案 0 :(得分:1)
使用首先尝试将与两个括号匹配的替换,然后不带括号(使用负向外观)有效地使对可选 - 即两者都缺席:
\s?([\[({][vV]?\d+\.\d+[ab]?[\])}]|(?<![\[({])[vV]?\d+\.\d+[ab]?(?![\])}]))(?=\W?\.\w{3})
请参阅live demo
此正则表达式仅与版本匹配,因此请替换为空白。
我还使文件扩展名变得灵活 - 处理了所有文件类型(如果这是不需要的,请将\w{3}
替换为txt
)。
版本号的正则表达式已经简化,并且删除了字符类中不必要的转义。
另请注意,您的方法稍微天真,因为括号类型不必匹配,例如(v1.2]
匹配。如果这不可能,请不要担心,但如果是,则需要为每个支架类型对单独更换。