我有以下代码,试图匹配增加*计数的金字塔,两边都有相同数量的空格。
//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}。所以,这就是我想知道的:
- 如何确保我的字符串中的所有行都是金字塔(从第一行到最后一行增加星数(完成),用新行分隔(完成),在空格内居中(完成),等长线( ???))?
- 如何简化正则表达式以减少命名捕获组的过度使用?