我正在試圖查找每個邊正好包含三個大寫字母的小寫字符的所有實例。然後我想打印這個模式的每一次出現。這是蟒蛇挑戰中的挑戰。以下是我有:匹配小寫字母正好包含三個大寫字母
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