我正在尝试查找每个边恰好被三个大写字符包围的小写字符的所有实例。然后,我想打印此模式的每个匹配项。这是python挑战赛中的一个挑战赛。这就是我所拥有的:
contents = "XXXiXXXjXXX"
contents.scan(/[^A-Z]*[A-Z]{3}[a-z][A-Z]{3}[^A-Z]*/) { |i| print i[3] }
当它应该打印"ij"
时,它只打印"i"
。我的正则表达式有什么问题?
发布于 2013-02-05 11:35:39
有几件事是错的,解释什么是错的是不切实际的。
如果您不需要使用单个正则表达式来完成此操作,这里有一种简单的方法:
puts " #{contents} ".split(/[A-Z]{3}/).&(("a".."z").to_a).join
发布于 2013-02-05 12:13:30
两件事。
[^A-Z]*
do do
一个有点复杂的lookaround解决方案:
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"]
发布于 2013-02-05 11:15:46
如果您删除了前/后条件,导致它不匹配,那么正则表达式将起作用。然后,您应该在要提取的值周围添加括号作为捕获组,如下所示:
match = contents.match(/[A-Z]{3}([a-z])[A-Z]{3}/)
match[1] if match
https://stackoverflow.com/questions/14699559
复制相似问题