我正在开发一个最近从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)如果在评论中不匹配。 (//或/ ** /)
答案 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)
- ...
- ...
- 如果在字符串中间,请不要匹配(感谢nohat)。
- 如果在评论中不匹配。 (//或/ ** /)
醇>
使用简单正则表达式无法做到。为此,您需要从左到右实际查看每个字符,并确定它是什么类型的,至少足以将来自其他字符串的多行注释的注释分开。东西,然后你需要看看“其他东西”部分是否包含你想要改变的东西。
现在,我不知道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[^"]*"/
如果没有或少数,请忽略这种情况。