0

我在一个巨大的日志文件中执行大规模更改时遇到问题。除了导致 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 语法时遇到了问题。有谁能帮忙吗?

4

3 回答 3

0

在我自己玩了一下之后,看起来反向引用 \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,
于 2013-07-25T08:41:13.053 回答
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.

于 2013-07-25T08:43:29.140 回答
0

如果您始终拥有固定长度的数字,那么执行您所做的事情就相当简单。即使你的表达写得不好,它也能胜任。如果是这种情况,请查看 Tom Lords 的回答。

我自己玩了一下,我可能会使用两个表达式 - 让它更容易。如果您必须一次性完成,这将起作用,但非常不安全:

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

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

于 2013-07-25T10:02:41.167 回答