【发布时间】:2019-08-22 11:02:33
【问题描述】:
我有以下代码,试图匹配增加* 计数的金字塔,两边都被相同数量的空格包围。
//pyramid
var p = " * \n" +
" *** \n" +
" ***** \n" +
" ******* \n" +
" ********* \n" +
"***********\n";
//not a pyramid - rows 2 and 3 do not increase in width
var np = " * \n" +
" ***** \n" +
" ***** \n" +
" ******* \n" +
" ********* \n" +
"***********\n";
//pyramid with more width variation, non-point top
var pspace = " ** \n" +
" **** \n" +
" ********** \n" +
" ************** \n" +
" **************** \n" +
"**********************\n";
final var REGEX = "((?<S>\\s*)(?<star>\\**)\\k<S>\\R(?=$|((?<S2>\\s*)(?<extra>\\*+)\\k<star>\\k<extra>\\k<S2>\\R)))+";
System.out.println("p is a pyramid: "+Pattern.matches(REGEX, p));
System.out.println("np is a pyramid: "+Pattern.matches(REGEX, np));
System.out.println("pspace is a pyramid: "+Pattern.matches(REGEX, pspace));
输出:
p 是一个金字塔:是的
np 是一个金字塔:假
pspace 是一个金字塔:是的
我要做的最后一件事是确保输入字符串的所有“行”长度相等。在这一点上,我完全陷入困境,因为除了固定长度的字符串边界(即X{min, max})之外我真的找不到任何东西。所以,这就是我想知道的:
- 如何确保我的字符串中的所有行都是金字塔(从第一行到最后一行增加星数(完成),由新行分隔(完成),在空格内居中(完成),并且相等长度线 (???))?
- 如何简化正则表达式以减少命名捕获组的过度使用?
【问题讨论】:
-
老实说,确定传入周期的建议高度和宽度可能更容易,然后在代码中生成正确的周期,并将该字符串与输入进行比较。
-
@TimBiegeleisen 我知道在没有正则表达式的情况下计算它可能会更容易。我想知道 Java 正则表达式是否有能力做到这一点,或者我是否应该放弃尝试找到一种方法。