2011-01-20 108 views
1

這是半個問題和半個有趣的測驗,因爲正則表達式會是可笑地複雜並難以創建。如果我自己做(,因爲我實際上需要使用它),我會寫一個文件解析器而不是正則表達式,儘管我知道在這種情況下可以使用正則表達式,並且我認爲也許是一些喜歡挑戰的StackOverflow編碼人員。這個替換正確的正則表達式是什麼?

作爲「獎勵」,我會將問題保留7天,此時150聲譽的賞金將歸於具有正確答案的人。我知道回答者的聲譽可能大於3K,但代表聲望仍然很高。 :)

正則表達式將不得不轉向:

[DllImport(EngineDll)] 
public static extern int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth)); 

分爲:

public static int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth)) 
{ 
    if (Engine.ThreadSafe) 
    { 
     lock (typeof(Dll)) 
     { 
      return Dll.Graphics(width, height, depth, hertz, flags); 
     } 
    } 
    else 
    { 
     return Dll.Graphics(width, height, depth, hertz, flags); 
    } 
} 

由於多完全不需要,你可以擁有這一切在1號線,如果你發現它更容易解析:

public static int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth)) { if (Engine.ThreadSafe) { lock (typeof(Dll)) { return Dll.Graphics(width, height, depth, hertz, flags); } } else { return Dll.Graphics(width, height, depth, hertz, flags); } } 

現在,如果它不夠明顯,什麼變量是返回類型,方法名稱,參數類型,參數名稱,參數是否具有默認值,在這種情況下是缺省值。該函數可能是一個void,在這種情況下,不應該有return語句。

根據要求:第二輸入 - 輸出:

[DllImport(EngineDll)] 
public static extern void EndRender(); 

輸出:

public static void EndRender() 
{ 
    if (Engine.ThreadSafe) 
    { 
     lock (typeof(Dll)) 
     { 
      Dll.EndRender(); 
     } 
    } 
    else 
    { 
     Dll.EndRender(); 
    } 
} 

再次,1-襯墊接受。

祝你好運! :)

請注意所有可能會說我只是懶惰的人:改變問題。

+0

我添加了`fun`和`code-bowling`標籤,因爲如你所說這是一項挑戰,並不是真正適合這項工作的工具。但它看起來有趣......哦,爲了清楚起見,你想要取代什麼?轉型的規則是什麼?你只是期望參數名稱添加到回調? – ircmaxell 2011-01-20 03:24:33

+0

@ircmaxell:我不明白你的問題,對不起。謹慎闡述? – Lazlo 2011-01-20 03:28:16

+0

所以你想要的基礎知識是從源移動到目的地的類名,輸入參數列表已移動,並且附加到兩個返回的參數名稱正確? – ircmaxell 2011-01-20 03:30:15

回答

1

對於真正的正則表達式,你不能這麼做,因爲你需要能夠在默認值中處理平衡括號。這就是說,有與擴展,允許你來處理這樣的事情正則表達式方言,讓我們讓球滾動:

s/[DllImport(EngineDll)]\npublic\ static\ extern\ #boilerplate 
    (?<method> #capturing group for the method signature 
    (?<return>\w+)\ #Method return type 
    (?<name>\w+)\(#Method name 
    (?<parameter>\w+\ #parameter type 
    (?<parname>\w+)\ #parameter name 
    (=\ (?&DEFAULTVALUEREGEX))? #optional default value 
    (?{$params = $+{parname}}) #Ok, so this isn't even pretending to be a regex 
           # anymore. If anyone has any better ideas... 
)(?:,\ #parameter seperator 
    \w+\ (?<par>\w+)\ (=\ (?&DEFAULTVALUEREGEX))? 
    (?{ $params .= ", " . $+{par}}))* # more parameters 
    \)); # boilerplate 
/
    public static $+{method} { if (Engine.ThreadSafe) { lock (typeof(Dll)) { return Dll.$+{name}($params); } } else { return Dll.$+{name}($params); }} 
    /x 

我沒有包括DEFAULTVALUEREGEX的定義,因爲這基本上是需要你來解析任何一種有效的C#表達式,這將足以掩蓋其餘的邏輯。它也使用了(?{code})構造,使得它甚至可以算作一種正則表達式,這是非常令人懷疑的。另外我還沒有測試過它,因爲我很懶,它很脆弱(它會破壞一堆仍然有效的C#)。

如果任何人有任何改進,隨時編輯它們 - 這就是爲什麼它是CWiki的第一位。

0

那麼,這有什麼問題?

s/.*/public static int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth)) { if (Engine.ThreadSafe) { lock (typeof(Dll)) { return Dll.Graphics(width, height, depth, hertz, flags); } } else { return Dll.Graphics(width, height, depth, hertz, flags); } }/; 

由於它(可能)是不是你腦子裏的東西,必須有另一個轉變,同樣的正則表達式也有做的事 - 我另有規定什麼是工作相當充足。