2016-08-20 58 views
1

使用Ruby。下面是一個示例文本:按句點加入正則表達式加入句子

乘坐成本E£4。這是值得有一個火炬照亮照明不佳 地區。這裏描述的大多數墓葬通常向遊客開放。他們是 按進入網站時發現的順序列出。關於陵墓,它們的裝飾和 歷史的最佳信息來源是Theban Mapping Project (www.thebanmappingproject.com)。拉美西斯之墓VII(KV 1)在主要的 入口附近是一座小而未完成的拉美西斯陵墓VII(公元前1136-1129)。 只有44.3米長 - 由於拉姆西斯突然死亡的皇家墳塋 - 它由一個走廊,一個墓室和一個未完成的第三個房間組成。

我嘗試以下,但它與下一個大寫字母一起匹配:

/\.[A-Z]/ #=> matches .T instead of . 

我想:

  • 比賽期間..Tomb只有 - 任何點是後跟大寫字母
  • 不匹配.3 in 44.3m
  • 不匹配.t.cwww.thebanmappingproject.com

回答

1

你嘗試?

/(\.)(?=[A-Z])/g 

它會匹配任何斑點,隨後用大寫字母

+0

'g'做什麼? – Victor

+0

/g修飾符將使這個匹配不僅適用於第一個點,但所有點後跟大寫字母,在您的示例中,它將匹配2個點,而不僅僅是一個 –

+1

@Victor和Sirus:Ruby不支持'/ g '。只有'/ i','/ m','/ x','/ o'。有關[Regexp](http://ruby-doc.org/core-2.3.0/Regexp.html),請參閱文檔中的「選項」一節。 –

0

你非常close.You只需要一個括號匹配點和全球改性劑克至匹配每個點後跟一個大寫字母,而不僅僅是第一:

/(\.)[A-Z]/g 
+0

該期限後的大寫字母不屬於比賽的一部分。這就是爲什麼Sirius對大寫字母使用了積極的向前看。 –

1

如果text是你的字符串,

text.scan(/(\.)[A-Z]/).flatten 
    #=> [".", "."] 

回報你問什麼,但真的是你想要的嗎?這可能是優選的寫

text.scan(/\.[A-Z]/) 
    #=> [".M", ".T"] 

text.gsub(/\.(?=[A-Z])/).with_object([]) { |_,a| a << Regexp.last_match.offset(0).first } 
    #=> [75, 342] 

text[75, 20] 
    #=> ".Most tombs describe" 
text[342, 20] 
    #=> ".Tomb of Ramses VII " 

20是arbritary)。

這裏使用String#gsub很有趣。我已經使用gsub,因爲沒有塊,它會返回一個枚舉器,我需要鏈接Enumerator#with_object。實際上丟棄了gsub返回的值。由於String#scan沒有塊不返回一個枚舉,使用它我會寫:

a = [] 
text.scan(/\.(?=[A-Z])/) { a << Regexp.last_match.offset(0).first } 
a #=> [75, 342] 

這決不會是世界的盡頭。