我正在设计一个抽象类,它将使用自动消息覆盖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 :(得分: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是大写字母而下一个是小写,那么你应该在当前字符之前插入一个空格。