【问题标题】:Notepad++ masschange using regular expressionsNotepad++ masschange 使用正则表达式
【发布时间】:2013-07-25 18:02:41
【问题描述】:

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

【问题讨论】:

  • 我很困惑。你能用一两句话说明你想做什么吗?
  • 将 ."123,456,789,012.999" 更改为:.123456789012.999,但是文件中的所有值都用逗号分隔,因此无法简单地删除逗号...

标签: regex notepad++


【解决方案1】:

在我自己玩了一下之后,看起来反向引用 \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]+)",

(注意我在“.”之前添加了一个“\”,以便它匹配文字“.”而不是“anything”。)

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

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

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

并替换为:

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

【讨论】:

  • 如果你愿意,我可以进一步回答这个问题。例如,也许您不需要总是匹配那个确切长度的数字;也许有些数字包含多于/少于 3 个逗号??
【解决方案2】:

不确定正则表达式组是否有限制,但您可以使用环视来保存 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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 虽然我同意这样一个更灵活的答案可能比我给出的答案更好(尽管我必须查看实际的文本文件才能确定)。但是,这样做有一个问题:您将 '"' 和 ',' 替换为 ' '。
    • @TomLord:至少",是的。我想我可以添加一个前瞻来确保它没有被错误地替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2015-02-12
    • 2012-04-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多