我有一堆看起来像这样的文件:
A.File.With.Dots.Instead.Of.Spaces.Extension
我想通过正则表达式转换为:
A File With Dots Instead Of Spaces.Extension
它必须在一个正则表达式中(因为我想在Total Commander的批量重命名工具中使用它)。
帮助我,正则表达的大师,你是我唯一的希望。
修改
有几个人提出了两步解决方案。两个步骤确实使这个问题变得微不足道,我真的希望找到一个可以在TC中工作的一步解决方案。我做了,BTW,设法找到一个一步的解决方案,只要文件名中有偶数个点就可以工作。所以我仍然希望有一个银弹表达(或证明/解释为什么一个人绝对不可能)。
答案 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做到这一点。但是我不知道你有哪种正则表达式支持。
/\.(?=.*\.)//
其中粗略转换为任何点/\./
之后有一些东西和一个点。显然,最后一个点是唯一一个不遵守的点。我忽略了点之间某种东西的“可选性”,因为数据看起来总是介于两者之间,“可选性”具有性能成本。
答案 5 :(得分:0)
找到所有点的另一种模式,但我在Mass File Renamer中找到的(windows)文件名中的最后一个是:
(?!\.\w*$)\.
我不知道对其他用户有多大用处,但是这个页面是一个早期的搜索结果,如果已经在这里,它会节省我一些时间。
如果后面跟着一个不间断的字母数字字符序列,导致输入结束(文件名),则会排除结果,否则会找到点字符的所有实例。