2011-08-03 39 views
1

我devicing一個抽象類,將自動發送的信息覆蓋的toString(),因爲這樣的:生成的toString()文本

public abstract class AbstractTask { 

    abstract void run(); 
    abstract int calculate(); 

    private String makeMessage() { 
     String raw = this.getClass().toString(); 
     // do regex stuff here! 
    } 

    @Override 
    public String toString() { 
     return makeMessage(); 
} 

我實現(延伸AbstractTask)類可以被稱爲像

TaskXRQMinimize 
TaskListParallell 
TaskVerifyRepositoryEmpty 
TaskCreateXRQs 
TaskCreateZRQs 
TaskSendAllSRQToTLS 

我想輸出調用類的toString()方法時,有:

Task XRQ Minimize 
Task List Parallell 
Task Verify Repository Empty 
Task Create XRQs 
Task Create ZRQs 
Task Send All SRQ To TLS 

我做了一個簡單的正則表達式來查找這些話:

([A-Z]{1}[a-z]+|[A-Z]{3}[a-z]?) 

如何實現這一點?

+0

您是否想找到XRQ,SRQ和TLS? – Leon

回答

3

使你的toString()抽象,強制子類通過返回固定字符串來實現它。扔掉解析類名稱並使用正則表達式 - 太脆弱並且性能較差。如果你真的想想這樣做,至少每個班做一次計算,並不是每次調用toString()

至於正則表達式,我有更好的東西:StringUtils#splitByCharacterTypeCamelCase()Apache Commons Lang(我們實在沒有必要重新發明一些東西):

StringUtils.splitByCharacterTypeCamelCase("fooBar")  = ["foo", "Bar"] 
StringUtils.splitByCharacterTypeCamelCase("foo200Bar") = ["foo", "200", "Bar"] 
StringUtils.splitByCharacterTypeCamelCase("ASFRules") = ["ASF", "Rules"] 

你的情況:

//yields [Task, Send, All, SRQ, To, TLS] 
StringUtils.splitByCharacterTypeCamelCase("TaskSendAllSRQToTLS") 
+0

不錯!我剛剛學到了一個新單詞:「Camel Case」=) – Theodor

0

我會只需迭代類的名稱並構建一個新的String即可。規則非常簡單:如果當前字符是大寫字母而下一個字母是小寫字母,那麼您應該在當前字符之前插入一個空格。

+0

你忘記了諸如SRQ和TLS之類的興趣吧!尤其是複數,即XRQ。 – Theodor

+0

除了複數以外,它可以與abrevations一起使用。我沒有注意到,對不起。無論如何,我同意托馬斯,這不是一個好的做法。 –

+0

你說得對,正則表達式對於這樣一個簡單的問題可能是不好的做法。 – Theodor

1

你應該使用類似str.replaceAll("(\\w)([A-Z]\\w)", "$1 $2")

我還沒有試過,但它看起來是合理的。它將aBc等所有序列替換爲「a Bc」。

+0

酷!看起來可以用一些推文工作,你能解釋一下「$ 1 $ 2」是做什麼的嗎? – Theodor

1

這應該把你在正確的軌道上:要提取,與環繞()正則表達式的

零件。那麼

String raw = "TaskXRQMinimize"; 
    String regexp = "([A-Z]{1}[a-z]+)([A-Z]{3})[a-z]?"; 
    Pattern pattern = Pattern.compile(regexp); 

    Matcher matcher = pattern.matcher(raw); 
    if (matcher.find()) 
    { 
     System.out.println("AFSDgaf " + matcher.groupCount()); 
     System.out.println("afdgafd " + matcher.group(1)); 
     System.out.println("afdgafd " + matcher.group(2)); 
    }