【问题标题】:Perl Regexes - Replacing certain instances of matchesPerl 正则表达式 - 替换某些匹配实例
【发布时间】:2009-12-07 04:54:28
【问题描述】:

我正在尝试替换源文件中的文本,就像如何 C 预处理器工作。我的方法是解析 常量及其值,并用 他们。我的问题如下:

在源文件中,我有:

#define CONSTANT 10
#define CONSTANT_PLUS_ONE CONSTANT + 1

我使用/^#define\s+(\w.*)\s+.*($key).*/ 匹配第二个 行,但是当我替换为s/$2/$defines{$key}/ 时,两者 CONSTANT 的实例被替换,即

#define CONSTANT 10
#define 10_PLUS_ONE 10 + 1

我是一个 Perl 新手,所以我希望有人可以 指出我正确的方向,或者如果我公然做了一个 愚蠢的错误。

【问题讨论】:

  • 您是否在替换正则表达式中使用 /g,但在您的问题中省略了它?

标签: regex perl


【解决方案1】:

尝试指定单词边界:

s/\b$2\b/$defines{$key}/g;

【讨论】:

  • 啊,完美。我已经试过这个了,有些搞砸了。谢谢你,我想我现在可以睡觉了!
【解决方案2】:

\w.* 将匹配一个单词字符,然后是任意数量的任意字符,这不是你想要的——你需要绑定到单词结尾,或者至少确保匹配中的每个字符都是单词字符,例如\w+。所以试试这个:

/^#define\s+(\w+)\s+($key).*/

perldoc perlre 上查看特殊字符和匹配类型的完整规范。

【讨论】:

  • 这可能更强大,但我认为 Conor 遇到的问题有所不同。
  • 我明白你在说什么,以太。那是个很好的观点。我也会修改这个。谢谢你的建议!
【解决方案3】:

您也可以只通过 C 预处理器运行您的代码。将其作为 STDIN 提交,这样编译器就不会尝试变得聪明并过多地读取文件扩展名。

cc -E - < <file> > <newfile>

如果这是你正在做的 Perl 源代码,它已经有常量了。是的,您可以获得内联的所有性能优势。

use constant PI => 3.14;
use constant CAKE => PI + 1.2345;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多