2008-08-29 147 views
8

我正在研究最近从X/Motif移动到Qt的C++代码库。我正在尝试编写一个Perl脚本,它将用布尔替换所有布尔值(来自X)。该脚本只是做了一个简单的替换。用布尔替换布尔值的正则表达式

s/\bBoolean\b/bool/g 

有几个条件。

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

更新时间:

#1,我回顾后

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

用于#2 ,我用了前瞻。

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

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

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

+0

旁注:http://stackoverflow.com/questions/72312/how-should-i-capitalize-perl#72757 – szabgab 2008-09-17 05:13:51

回答

0

要修复条件1次尝试:

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

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

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

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

3

S/[^:] \ bBoolean \ B /布尔/克

此不匹配的字符串,其中布尔是在该行监守[开头^(“?!): ]是“匹配不是:”的一个字符

2

注意与该报价匹配的前瞻断言。只有匹配布尔是字符串的最后部分,但不在如果你想确保你不在一个字符串中,你需要匹配匹配前的偶数个引号(假设没有多行字符串并且没有隐藏的嵌入式引号)。

0

3)如果在字符串中间不匹配(谢谢nohat)。

你也许可以写一个reg ex来检查“。* Boolean。*”。但是如果你在字符串中有引号(“),那么你会做更多的工作来排除(\”)模式。

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

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

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

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

我的建议是使用一些词汇工具,C++,并与布尔更换令牌布尔。你的想法?

0

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

0
  1. ...
  2. ...
  3. 不匹配,如果在一个字符串中间(nohat感谢)。
  4. 不匹配,如果在评论。 (//或/ ** /)

否能够以简单正则表达式做。对于这一点,你需要实际观察一下左到右的每一个性格和决定它是什么样的事情,至少不够好,告诉除了多行注释从其他的东西串注释,然后你需要看看“其他东西”部分是否包含你想改变的东西。

现在,我不知道确切在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  弗里德尔的Mastering Regular Expressions如果你想明白这里发生了什么。

0

的“在字符串中间‘布尔’”的部分听起来有点不太可能,我会首先检查是否有与一些代码的任何发生像

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

如果有没有或几个,只是忽略了这种情况。

1
#define Boolean bool 

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