2013-02-05 133 views
0

我正在试图查找每个边正好包含三个大写字母的小写字符的所有实例。然后我想打印这个模式的每一次出现。这是蟒蛇挑战中的挑战。以下是我有:匹配小写字母正好包含三个大写字母

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

它只打印"i",当它应该打印"ij"。我的正则表达式有什么问题?

+0

你见过没有块'scan'的结果呢?它是'XXXiXXXj'。所以'打印我[3]'只会打印一个字符。 – halfelf

+0

那么我如何重复检查模式并提取每个字符? – ordinary

+0

这可能是没有意义的,如果你最终大幅改写这个,但是你有没有试过用三个以上的大写字母来测试它?我期望你的正则表达式匹配'FOURxMORE',在'F'和'O'之间以及'R'和''之间出现'[^ AZ] *'(即'[^ AZ]'_zero_) E'。 – Scott

回答

-1

如果您删除前/后标准导致它不匹配,则正则表达式起作用。然后,你应该添加括号围绕要提取,这样的价值捕获组:

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

我如何检查整个文本的模式,而不仅仅是一场比赛? – ordinary

+0

当它前后有三个以上大写字母时,这将错误地匹配。 – sawa

0

有几件事情错了,这是不实际的解释什么是错的。

如果你不需要用一个单一的正则表达式来做到这一点,这里有一个简单的方法:

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

两件事情。

  • [^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"] 
相关问题