4

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

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

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

A File With Dots Instead Of Spaces.Extension

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

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

编辑

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

4

6 回答 6

4

看来 Total Commander 的正则表达式库不支持环视表达式,因此您可能必须一次替换多个点,直到没有点为止。代替:

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

$1 $2 $3.$4

(重复顺序和反向引用的数量以获得更高的效率。您最多可以达到 9 美元,这可能不够,也可能不够。)

抱歉,在 Total Commander 中似乎没有任何方法可以用一个明确的表达来做到这一点。

于 2009-06-20T14:36:11.873 回答
2

基本上:

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

将用纯正则表达式来完成。这意味着,替换后面跟着一串字符(非贪婪)的任何句点,然后是一个没有任何内容的句点。这是一个积极的展望

在 PHP 中,这是这样完成的:

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

其他语言各不相同,但原理是一样的。

于 2009-06-20T14:29:29.983 回答
1

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

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

粗略地说,这是“任何点的东西,减去点,也许再加上行尾的另一个点。” 我不能完全确定您是要删除点还是将其转换为空格-如果是后者,请将替换更改为“ \1”(当然要减去引号)。

[编辑将 + 更改为 *,如下面的海伦。]

于 2009-06-20T16:54:58.023 回答
1

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

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

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

如果结果后面是连续的字母数字字符序列,导致输入(文件名)的结尾,则它会排除结果,否则会找到点字符的所有实例。

于 2015-01-07T13:38:01.317 回答
1

或者用空格替换所有点,然后用 .[Extension] 替换 [space][Extension]

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

于 2011-09-28T20:06:51.557 回答
0

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

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

这大致翻译为任何点/\./,之后有一些东西和一个点。显然,最后一个点是唯一不符合要求的点。我省略了点之间某些东西的“可选性”,因为数据看起来总是介于两者之间,并且“可选性”具有性能成本。

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

于 2009-06-20T14:33:25.920 回答