2008-08-29 108 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。