用bool替换Boolean的正则表达式

时间:2008-08-29 19:59:14

标签: regex perl

我正在开发一个最近从X / Motif转移到Qt的C ++代码库。我正在尝试编写一个Perl脚本,用bool替换所有出现的布尔值(来自X)。该脚本只是做了一个简单的替换。

s/\bBoolean\b/bool/g

有几个条件。

1)我们的代码中有CORBA,\ b匹配CORBA :: Boolean,应该更改。
2)如果发现它是一个字符串(即“布尔”)

,它不应该匹配

更新

对于#1,我使用了lookbehind

s/(?<!:)\bBoolean\b/bool/g;

对于#2,我使用了前瞻。

s/(?<!:)\bBoolean\b(?!")/bool/g</pre>

这很可能适用于我的情况但是如何改进?

3)如果在字符串的中间,请不要匹配(感谢nohat) 4)如果在评论中不匹配。 (//或/ ** /)

9 个答案:

答案 0 :(得分:3)

  

S / [^:](?!“)\ bBoolean \ B /布尔/克

这与布尔所在的字符串不匹配,因为行的开头是[^:]是“匹配不是的字符:”。

答案 1 :(得分:2)

注意引用匹配的前瞻断言。如果 Boolean 是字符串的最后一部分,但不在字符串的中间,那么这只会匹配。如果你想确定你不在字符串中(假设没有多行字符串且没有转义的嵌入引号),你需要匹配匹配前的偶数引号。

答案 2 :(得分:1)

s/[^:]\bBoolean\b[^"]/bool/g

编辑:老鼠,再次被打败。 +1击败我,先生。

答案 3 :(得分:1)

#define Boolean bool

让预处理者来处理这个问题。每次看到布尔值时,您都可以手动修复它,或希望正则表达式不会出错。根据您使用的宏数量,您可以转储出cpp。

答案 4 :(得分:0)

要修复条件1,请尝试:

s/[^:]\bBoolean\b(?!")/bool/g

[^:]表示匹配“:”以外的任何字符。

答案 5 :(得分:0)

  

3)如果在字符串的中间,请不要匹配(感谢nohat)。

您也许可以编写一个注册表来检查“。* Boolean。*”。但是如果你在字符串中有引号(“)怎么办呢?那么,你有更多的工作要不排除(\”)模式。

  

4)如果在评论中不匹配。 (//或/ * * /)

对于'//',你可以有一个正则表达式来排除//.*但是,最好是先用正则表达式来比较//注释的整行((。*)(//。* ))然后仅在$ 1(第一个匹配模式)上应用替换。

对于/ * * /,它更复杂,因为这是多线模式。一种方法可以是首先运行整个代码以匹配多行注释,然后仅取出不匹配的部分......类似......(。*)(/ *。/ /)(。*)。但是,实际的正则表达式会更加复杂,因为你不会有更多的多行注释。

现在,如果你有/ *或* /里面//阻止怎么办? (我不知道你为什么会这样做..但墨菲定律说你可以拥有它)。显然有一些出路,但我的想法是强调正则表达式会变得多么糟糕。

我的建议是在C ++中使用一些词法工具,并用bool替换标记布尔值。你的想法?

答案 6 :(得分:0)

为了避免在perl中编写完整的C解析器,你试图取得平衡。根据需求变化的多少,我倾向于做一些非常严格的事情// //然后将任何仍然匹配/ Boolean /的内容写入异常文件以供人类决策。这样你就不会试图解析可能存在的C中间字符串,多行注释,条件编译文本等。

答案 7 :(得分:0)

  
      
  1. ...
  2.   
  3. ...
  4.   
  5. 如果在字符串中间,请不要匹配(感谢nohat)。
  6.   
  7. 如果在评论中不匹配。 (//或/ ** /)
  8.   

使用简单正则表达式无法做到。为此,您需要从左到右实际查看每个字符,并确定它是什么类型的,至少足以将来自其他字符串的多行注释的注释分开。东西,然后你需要看看“其他东西”部分是否包含你想要改变的东西。

现在,我不知道C ++中注释和字符串的完全语法规则,因此以下内容将是不精确且完全不适用的,但它会让您了解复杂性你反对。

my $line_comment      = qr! (?> // .* \n? ) !x;
my $multiline_comment = qr! (?> /\* [^*]* (?: \* (?: [^/*] [^*]* )? )* )* \*/ ) !x;
my $string            = qr! (?> " [^"\\]* (?: \\ . [^"\\]* )* " ) !x;
my $boolean_type      = qr! (?<!:) \b Boolean \b !x;

$code =~ s{ \G (
      $line_comment
    | $multiline_comment
    | $string
    | ( $boolean_type )
    | .
) }{
    defined $2 ? 'bool' : $1
}gex;

请不要让我解释这一切的复杂性,这需要我一天又一天。如果你想了解这里发生了什么,只需购买并阅读Jeff Friedl的Mastering Regular Expressions

答案 8 :(得分:0)

字符串中间的“'布尔值”部分听起来有点不太可能,我会首先检查代码中是否有任何类似

的内容
m/"[^"]*Boolean[^"]*"/

如果没有或少数,请忽略这种情况。