如何从文件名中消除点,文件扩展名除外

时间:2009-06-20 14:21:44

标签: regex total-commander

我有一堆看起来像这样的文件:

A.File.With.Dots.Instead.Of.Spaces.Extension

我想通过正则表达式转换为:

A File With Dots Instead Of Spaces.Extension

它必须在一个正则表达式中(因为我想在Total Commander的批量重命名工具中使用它)。

帮助我,正则表达的大师,你是我唯一的希望。

修改

有几个人提出了两步解决方案。两个步骤确实使这个问题变得微不足道,我真的希望找到一个可以在TC中工作的一步解决方案。我做了,BTW,设法找到一个一步的解决方案,只要文件名中有偶数个点就可以工作。所以我仍然希望有一个银弹表达(或证明/解释为什么一个人绝对不可能)。

6 个答案:

答案 0 :(得分:4)

看来Total Commander的正则表达式库不支持外观表达式,因此您可能不得不一次更换多个点,直到没有任何点。替换:

([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)$

$1 $2 $3.$4

(重复序列和反向引用次数以提高效率。最高可达9美元,这可能是也可能不够。)

看来没有任何办法可以在Total Commander中使用一个明确的表达式,抱歉。

答案 1 :(得分:2)

基本上:

/\.(?=.*?\.)//

将以纯正则表达式完成。这意味着,替换任何后跟一串字符(非贪婪)的句点,然后替换没有任何句号的句点。这是positive lookahead

在PHP中,这可以完成:

$output = preg_replace('/\.(?=.*?\.)/', '', $input);

其他语言各不相同,但原则相同。

答案 2 :(得分:1)

这是基于你几乎解决方案的一个:

/\.([^.]*(\.[^.]+$)?)/\1/

粗略地说,这是“任何点数,减去点数,也可能加上行尾的另一个点数。”我无法确定你是否想要删除点或转向空格 - 如果是后者,将替换更改为“\ 1”(当然减去引号)。

[编辑将+更改为a *,如下面的Helen所示。]

答案 3 :(得分:1)

或用空格替换所有点,然后用[空格] [扩展名]替换。[扩展名]

A.File.With.Dots.Instead.Of.Spaces.Extension 至 带点的文件而不是空间扩展 至 带点的文件而不是Spaces.Extension

答案 4 :(得分:0)

你可以用Lookahead做到这一点。但是我不知道你有哪种正则表达式支持。

/\.(?=.*\.)//

其中粗略转换为任何点/\./之后有一些东西和一个点。显然,最后一个点是唯一一个不遵守的点。我忽略了点之间某种东西的“可选性”,因为数据看起来总是介于两者之间,“可选性”具有性能成本。

检查: http://www.regular-expressions.info/lookaround.html

答案 5 :(得分:0)

找到所有点的另一种模式,但我在Mass File Renamer中找到的(windows)文件名中的最后一个是:

(?!\.\w*$)\.

我不知道对其他用户有多大用处,但是这个页面是一个早期的搜索结果,如果已经在这里,它会节省我一些时间。

如果后面跟着一个不间断的字母数字字符序列,导致输入结束(文件名),则会排除结果,否则会找到点字符的所有实例。