2013-02-05 190 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"] 
相關問題