2010-04-02 89 views
1

我想爲我正在開發的代碼生成器提供一些模板。一個典型的模式是:字符串替換問題

public ${class_type} ${class_name} extends ${super_class} implements ${interfaces} { 

${class_body} 

} 

問題是,如果super_class是空白或接口。我用空字符串替換了$ {super_class}。但我得到額外的空間。因此,與沒有super_class和接口的類落得像:

public class Foo { //see the extra spaces before {? 

${class_body} 

} 

我知道我可以用單取代多個空格,但有沒有更好的方法嗎?

編輯: 我收到了一些很好的答案,但它沒有解決這個問題。我無法指定模板,用戶將設置它。否則,有什麼意義?有,如果他們喜歡什麼:

public ${class_type} ${class_name} extends ${super_class} 
            implements ${interfaces} { 

${class_body} 

} 

我想我可以隨時刪除extends ${super_class}implements ${interfaces}之間的所有空格,當任何一個空白。它仍然不是完美的,但會更好。

+0

如果您提供處理此問題的代碼生成器的代碼,也許您的問題會更清楚。 – NomeN 2010-04-02 10:49:27

回答

0

一個好方法是編寫一個空字符串空白的關鍵字,並把空間吞噬到下一個關鍵字。方法簽名將爲:

void blankKeyword(String content, String keyword, String next); 

寫起來應該不會太困難。

2

在字符串「extends $ {super_class}」等中包含前面的空格,所以當你插入一個空字符串時,根本不會產生空格。

編輯:顯然,除了上述修復之外,您應該刪除字符串之間的空格。

2

兩個選項:

一個:更改您的模板:

public ${class_type} ${class_name}${super_block}${interfaces_block} { 
${class_body} 
} 

...並經常更換${super_block}${interfaces_block}   —或者與 「擴展父類」(注意空格在前面,但不在結尾)或空白的字符串。 (同樣,接口塊將「實現Foo」[也是前面的空格]或空白)。

兩個:確保在替換時在前面包括空格(編輯:as Amir suggested)。但是當你處理像super和interfaces這樣的多塊時,這會變得棘手。

(旁註:你的報價模板具有開放{,這有助於問題之前的界面位後兩個空格。)

1

只需在您的替換模式前面的空間,即_extends_${super_class}_implements_${interfaces}可替換爲空字符串(我使用下劃線使其更加明確)。

...${class_name}_extends_${super_class}_implements_${interfaces}_{ 
       \_____________________/\_______________________/ 
        optional    optional 

思考問題的一種方法是將空間視爲它:分隔符。類似地,你的問題是這樣的:

你有ABC可能出現的順序,除BC是可選的。你想把它們列爲一個元組,即被()包圍,相隔,。也就是說,這些都是有效的元組:

(A,B,C) 
(A,B) 
(A,C) 
(A) 

現在是比較明顯的,你可以在前面的逗號連接到BC。也就是說,元組由4部分組成,(A + ,B + ,C + ),中間兩個是可選的 - 這樣你就不會得到任何額外的分隔符。


注:包括代碼生成的簡單便利的原因,一些語法允許以可變長度列表類似的句子末尾的尾隨逗號。例如,在Java中,這是一個有效的數組初始化:

int[] arr = new int[] { 1, 2, } 
          ^
          perfectly okay! 

對於這些類型的語法,它更有意義附加分隔符各部分代替了。你可以讓你的代碼生成更復雜,以至於它不會產生尾隨逗號(也許是因爲你不喜歡看到它),但是很多語法確實允許它們使用這種簡化「捷徑」。

+0

這不就是幾分鐘前艾米爾所說的嗎? (http://stackoverflow.com/questions/2565335/string-replacement-problem/2565348#2565348) – 2010-04-02 06:42:37

+0

我的網絡很慢,不可靠,我該怎麼辦。你應該看到有一次我意外地三倍發佈了一個答案......都有相同的錯字。 – polygenelubricants 2010-04-02 06:54:27

0

我想補充一些方式來表示選擇:

public ${class_type} ${class_name} [extends ${super_class} ][implements ${interfaces} ]{ 
    ${class_body} 
} 

所以去掉空格代替,我還不包括空格,如果用戶沒有指定的繼承關係。