从类名生成toString()文本

时间:2011-08-03 11:10:51

标签: java regex 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]?)

我该如何实现?

4 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

你应该使用像str.replaceAll("(\\w)([A-Z]\\w)", "$1 $2")

这样的东西

我没试过,但看起来很合理。它将aBc等所有序列替换为“a Bc”。

答案 2 :(得分: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));
    }

答案 3 :(得分:0)

我只是迭代类的名称并构建一个新的String。规则很简单:如果当前的char是大写字母而下一个是小写,那么你应该在当前字符之前插入一个空格。