使用正则表达式的Notepad ++ masschange

时间:2013-07-25 07:39:28

标签: regex notepad++

我在巨大的日志文件中执行批量更改时遇到问题。 除了导致Notepad ++出现问题的文件大小外,我有一个问题是使用10个以上的参数进行替换,最多9个工作正常。

我需要在文件中更改数值,其中这些值位于引号内并带有前导和结尾逗号:."123,456,789,012.999",

我使用此exp来查找并替换格式为:
,123456789012.999,(因此num.value中没有引号和逗号)

用于查找的exp是:

([,])(["])([0-9]+)([,])([0-9]+)([,])([0-9]+)([,])([0-9]+)([\.])([0-9]+)(["])([,])

和要替换的exp是:

\1\3\5\7\9\10\11\13

问题是参数\11 \13不起作用(示例中的.999字符不会出现在更改的值中)。

所以现在问题是 - 参数是否有限制?
对于我来说,它似乎不适用于10以上。对于较短的num.values,我需要使用最多9个参数,serach和替换的字符串工作正常,对于上面的示例搜索工作但不是替换,结束更改的值已损坏。

另外,我想到的是,我可以直接更改unix服务器上的日志文件而不是使用Notepad ++,但是我遇到了构建正确perl语法的问题。任何可以提供帮助的人都可以吗?

3 个答案:

答案 0 :(得分:0)

在自己玩了一点之后,看起来像back-references \ 11- \ 99在notepad ++中是无效的(这并不奇怪,因为这通常是从正则表达式语言中省略的。)但是,有几件事你可以要改进那个正则表达式,以使这项工作成功。

首先,您应该考虑使用较少的组,或者非捕获组。你是否真的需要在该正则表达式中存储13个变量才能进行替换?显然不是,因为你甚至没有使用其中的一半!

简单地说,你可以从正则表达式中删除一些括号:

[,]["]([0-9]+)[,]([0-9]+)[,]([0-9]+)[,]([0-9]+)[.]([0-9]+)["][,]

并替换为:

,\1\2\3\4.\5,

......但这不是全部!为什么你用方括号来说“匹配任何内部”,如果里面只有一个东西?我们也可以摆脱这些:

,"([0-9]+),([0-9]+),([0-9]+),([0-9]+)\.([0-9]+)",

(注意我在“。”之前添加了一个“\”,因此它匹配文字“。”而不是“任何”。)

此外,虽然这不是什么大问题,但您可以使用“\ d”而不是“[0-9]”。

这使您的最终优化正则表达式:

,"(\d+),(\d+),(\d+),(\d+)\.(\d+)",

并替换为:

,\1\2\3\4.\5,

答案 1 :(得分:0)

不确定正则表达式组是否有限制,但您可以使用外观来保存2个组,您也可以合并示例中的某些组。但首先,让我们来一些无用的角色类

(\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+)(\.)([0-9]+)(")(,)

我们可以合并这些组:

(\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+)(\.)([0-9]+)(")(,)
                                        ^^^^^^^^^^^^^^^^^^^^

我们得到:

(\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+\.[0-9]+)(")(,)

让我们添加一些外观:

(?<=\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+\.[0-9]+)(")(?=,)

替换为\2\4\6\8

答案 2 :(得分:0)

如果您始终拥有固定长度的数字,那么您可以轻松完成所做的工作。即使你的表达写得不好,它也可以胜任。如果是这种情况,请看Tom Lords的答案。

我自己玩了一下,我可能会使用两个表达式 - 让它变得更容易。如果你必须在一个,这将工作,但是非常不安全:

(?:"|(\d+),)|(\.\d+)"(?=,)替换为\1\2

现场演示:http://regex101.com/r/zL3fY5