0

我试图找到每边恰好被三个大写字符包围的小写字符的所有实例。然后我想打印这种模式的每次出现。这是python挑战中的一个挑战。这是我所拥有的:

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

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

4

3 回答 3

0

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

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

puts " #{contents} ".split(/[A-Z]{3}/).&(("a".."z").to_a).join
于 2013-02-05T03:35:38.837 回答
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"]
于 2013-02-05T04:13:30.223 回答
-1

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

match = contents.match(/[A-Z]{3}([a-z])[A-Z]{3}/)
match[1] if match
于 2013-02-05T03:15:46.483 回答