正则表达式将布尔替换为布尔

时间:2020-03-05 18:45:11  来源:igfitidea点击:

我正在研究最近从X / Motif迁移到Qt的C ++代码库。我正在尝试编写一个Perl脚本,该脚本将所有出现的布尔值(从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)如果有注释,则不匹配。 (// 或者 /**/)

解决方案

回答

要修复条件1,请尝试:

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

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

回答

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

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

回答

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

这与字符串为Boolean的字符串不匹配,因为[^:]行的开头是"匹配不是:的字符"。

回答

注意与引用匹配的超前断言。仅当布尔值是字符串的最后一部分而不是字符串的中间部分时才匹配。如果要确保我们不在字符串中(假设没有多行字符串并且没有转义的嵌入式引号),则需要在比赛之前将偶数个引号匹配。

回答

3) Do not match if in the middle of a string (thanks nohat).

我们也许可以编写一个正则表达式来检查"。* Boolean。*"。但是,如果在字符串中包含quote(")怎么办?因此,我们还有更多工作不排除(")模式。

4) Do not match if in a comment. (// or /* */)

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

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

现在,如果在//块内有/ 或者/怎么办? (我不知道我们为什么要拥有它。。但是墨菲的法律规定我们可以拥有它)。显然有一些出路,但是我的想法是强调正则表达式将变得多么糟糕。

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

回答

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

回答

…
  …
  Do not match if in the middle of a string (thanks nohat).
  Do not match if in a comment. (// or /**/)

没有一个简单的正则表达式可以做。为此,我们实际上需要从左到右查看每个字符,并确定它是什么样的东西,至少足以将多行注释与其他内容的字符串区别开来,然后我们需要查看其他内容部分是否包含我们要更改的内容。

现在,我不知道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  ? 'bool' : 
}gex;

请不要要求我以所有复杂的方式来解释,这将花费我一天又一天的时间。如果我们想确切了解此处发生的情况,只需购买并阅读JeffFriedls掌握正则表达式。

回答

"'在字符串中间的'布尔'"部分听起来不太可能,我首先检查代码中是否有类似的东西出现,例如

m/"[^"]*Boolean[^"]*"/

如果不存在或者仅有少量,则忽略该情况。

回答

#define Boolean bool

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