我试图找到每边恰好被三个大写字符包围的小写字符的所有实例。然后我想打印这种模式的每次出现。这是python挑战中的一个挑战。这是我所拥有的:
contents = "XXXiXXXjXXX"
contents.scan(/[^A-Z]*[A-Z]{3}[a-z][A-Z]{3}[^A-Z]*/) { |i| print i[3] }
它只"i"
在应该打印的时候打印"ij"
。我的正则表达式有什么问题?
有几件事是错误的,解释什么是错误的是不切实际的。
如果您不需要使用单个正则表达式,这是一种简单的方法:
puts " #{contents} ".split(/[A-Z]{3}/).&(("a".."z").to_a).join
2 件事。
[^A-Z]*
什么都不做一个有点复杂的环视解决方案:
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"]
如果您删除导致它不匹配的前/后标准,则正则表达式有效。然后,您应该围绕要提取的值添加括号作为捕获组,如下所示:
match = contents.match(/[A-Z]{3}([a-z])[A-Z]{3}/)
match[1] if match