我正在试图查找每个边正好包含三个大写字母的小写字符的所有实例。然后我想打印这个模式的每一次出现。这是蟒蛇挑战中的挑战。以下是我有:匹配小写字母正好包含三个大写字母
contents = "XXXiXXXjXXX"
contents.scan(/[^A-Z]*[A-Z]{3}[a-z][A-Z]{3}[^A-Z]*/) { |i| print i[3] }
它只打印"i"
,当它应该打印"ij"
。我的正则表达式有什么问题?
我正在试图查找每个边正好包含三个大写字母的小写字符的所有实例。然后我想打印这个模式的每一次出现。这是蟒蛇挑战中的挑战。以下是我有:匹配小写字母正好包含三个大写字母
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
两件事情。
[^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"]
你见过没有块'scan'的结果呢?它是'XXXiXXXj'。所以'打印我[3]'只会打印一个字符。 – halfelf
那么我如何重复检查模式并提取每个字符? – ordinary
这可能是没有意义的,如果你最终大幅改写这个,但是你有没有试过用三个以上的大写字母来测试它?我期望你的正则表达式匹配'FOURxMORE',在'F'和'O'之间以及'R'和''之间出现'[^ AZ] *'(即'[^ AZ]'_zero_) E'。 – Scott