匹配由正好三个大写字母限定的小写字母

时间:2013-02-05 03:09:51

标签: ruby regex

我正在尝试查找小写字符的所有实例,每个字符由每边的三个大写字符包围。然后我想打印这种模式的每一个出现。这是python挑战中的挑战。这就是我所拥有的:

contents = "XXXiXXXjXXX"
contents.scan(/[^A-Z]*[A-Z]{3}[a-z][A-Z]{3}[^A-Z]*/) { |i| print i[3] }

仅在打印"i"时打印"ij"。我的正则表达式有什么问题?

3 个答案:

答案 0 :(得分:0)

有几件事是错误的,解释错误是不切实际的。

如果您不需要使用单个正则表达式,这是一个简单的方法:

puts " #{contents} ".split(/[A-Z]{3}/).&(("a".."z").to_a).join

答案 1 :(得分:0)

2件事。

  • 您的[^A-Z]*没有做任何事情
  • 第一次扫描指针超过完全匹配 这就是为什么它不会拿起'j'。

一个有点复杂的环视解决方案:

re = /
  (?<=[A-Z]{3}) # 3 uppers behind
  (?<![A-Z]{4}) # but not 4
  [a-z] # one lower
  (?=[A-Z]{3}) # 3 uppers ahead
  (?![A-Z]{4}) # but not 4
/x

'XXXiXXXjXXX'.scan re
#=> ["i", "j"]

答案 2 :(得分:-1)

如果删除前/后标准导致它不匹配,则正则表达式有效。然后,您应该将parens作为捕获组添加到要提取的值周围,如下所示:

match = contents.match(/[A-Z]{3}([a-z])[A-Z]{3}/)
match[1] if match