gpt4 book ai didi

java - codingBat repeatEnd 使用正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:58 26 4
gpt4 key购买 nike

我试图尽可能多地理解正则表达式,所以我想出了这个基于正则表达式的解决方案来解决 codingbat.com repeatEnd :

Given a string and an int N, return a string made of N repetitions of the last N characters of the string. You may assume that N is between 0 and the length of the string, inclusive.

public String repeatEnd(String str, int N) {
return str.replaceAll(
".(?!.{N})(?=.*(?<=(.{N})))|."
.replace("N", Integer.toString(N)),
"$1"
);
}

部分解释:

  • .(?!.{N}) : 断言匹配的字符是最后 N 个字符之一,确保后面没有 N 个字符。
  • (?=.*(?<=(.{N}))) : 在这种情况下,使用 lookforward 首先一直到字符串的末尾,然后使用嵌套的 lookbehind 将最后 N 个字符捕获到 \1 中.请注意,此断言将始终为真。

  • |. :如果第一个断言失败(即前面至少有 N 个字符),则无论如何都要匹配该字符; \1将是空的。

  • 无论哪种情况,总是匹配一个字符;将其替换为 \1 .

我的问题是:

  • 这种嵌套断言技术是否有效? (即在向前看时向后看?)
  • 是否有更简单的基于正则表达式的解决方案?

奖金问题

repeatBegin (如类似定义)。

老实说,我在这方面遇到了麻烦!

最佳答案

不错!我没有看到显着改进该正则表达式的方法,尽管我会重构它以避免不必要地使用负逻辑:

".(?=.{N})|.(?=.*(?<=(.{N})))"

这样,在您到达最后的 N 个字符之前,永远不会输入第二个备选方案,我认为这使意图更清晰一些。

我从未见过任何引用资料说可以嵌套环顾四周,但像 Bart 一样,我不明白为什么不可以。我有时会在 lookbehinds 中使用 lookaheads 来绕过可变长度 lookbehind 表达式的限制。


编辑:我刚刚意识到我可以通过将交替放在先行中来大大简化正则表达式:

".(?=.{N}|.*(?<=(.{N})))"

顺便问一下,您是否考虑过使用 format() 来构建正则表达式而不是 replace()

return str.replaceAll(
String.format(".(?=.{%1$d}|.*(?<=(.{%1$d})))", N),
"$1"
);

关于java - codingBat repeatEnd 使用正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2606214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com