作为个人学习练习,我编写了这个正则表达式来将一元字符串拆分为长度增加 2 次方的部分(另见 ideone.com):
for (String s :
new String(new char[500])
.split("(?=(.*))(?<=(?<=(^.*))\\G.*)(?<=(?=\\2\\2.\\1)^.*)")
) {
System.out.printf("%s ", s.length());
}
// prints "1 2 4 8 16 32 64 128 245 "
这结合了环视期间的捕获、嵌套环视、反向引用匹配和无限长的后视(Java 中不正式支持但无论如何都可以使用)。也利用了 2 的幂和的属性以及字符串具有一元字母表的事实。
这个解决方案既不可读,性能也很糟糕。
我的问题是,你将如何“优化”这个正则表达式?
- 你能让正则表达式更具可读性吗(如果性能更差也没关系)
- 你能让正则表达式表现得更好吗(如果它不那么可读也没关系)