2016-08-20 63 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] 

这决不会是世界的尽头。