如何用正则表达式检测并提取长度≥3的回文子串?
提取长度至少为3个字符的回文子串:正则表达式可行吗?
我需要用正则表达式从字符串中提取所有长度至少为3的回文子串,期望实现如下效果:
str = "abcbd" puts sub_str_palindrome(str) # 输出 ["bcb"] str = "abcde" puts sub_str_palindrome(str) # 输出 []
可行,但要注意正则表达式的局限性:它没法直接匹配任意长度的回文,但可以通过分情况匹配奇数长度和偶数长度的回文来覆盖需求(偶数长度回文需至少4个字符,满足≥3的要求)。
方案一:结合正则实现
下面是Ruby的实现代码,利用正向预查捕获所有符合要求的回文子串:
def sub_str_palindrome(str) palindromes = [] # 匹配奇数长度回文(形如aba,长度≥3) str.scan(/(?=(.)(.)\1)/) do |match| palindromes << match.join + match[0] end # 匹配偶数长度回文(形如abba,长度≥4) str.scan(/(?=(.)\1(.)\1)/) do |match| palindromes << match[0] * 2 + match[1] + match[0] end palindromes.uniq end # 测试示例 str = "abcbd" puts sub_str_palindrome(str).inspect # => ["bcb"] str = "abcde" puts sub_str_palindrome(str).inspect # => []
思路说明:
- 用**正向预查
(?=...)**捕获所有可能的回文起始位置,避免重复匹配同一子串的不同起始点 - 分两类匹配:奇数长度回文以单个字符为中心,偶数长度回文以两个相同字符为中心
- 最后用
uniq去重,避免同一回文被多次捕获
方案二:更灵活的通用写法
如果需要覆盖所有长度≥3的回文(比如5、7等更长的奇数回文),单纯靠正则会非常繁琐,此时结合字符串反转对比的逻辑更清晰:
def sub_str_palindrome(str) (3..str.length).flat_map do |len| str.each_char.each_cons(len).map(&:join).select { |sub| sub == sub.reverse } end.uniq end # 测试多回文场景 str = "abbaabcba" puts sub_str_palindrome(str).inspect # => ["abba", "abcba", "bcb"]
这种方法枚举所有长度≥3的子串,再判断是否为回文,逻辑简单且能覆盖所有情况,适合大多数场景。
内容的提问来源于stack exchange,提问作者Ritesh Choudhary
相关产品推荐
相关产品推荐

