我在巨大的日志文件中执行批量更改时遇到问题。 除了导致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语法的问题。任何可以提供帮助的人都可以吗?
答案 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