匹配句点加入句子与正则表达式

时间:2016-08-20 19:04:14

标签: ruby regex

使用Ruby。这是一个示例文本:

  

乘车费用为4英镑。值得拥有一个能够点亮灯光的火炬   这里描述的大多数墓葬通常对游客开放。他们是   按进入网站时找到的顺序列出。该   关于坟墓,他们的装饰和坟墓的最佳信息来源   历史是Theban Mapping Project   (www.thebanmappingproject.com)。拉美西斯七世(KV 1)附近的主要   入口是拉美西斯七世(公元前1136-1129)的小型未完工的坟墓。   只有44.3米长 - 由于拉美西斯的突然而成为皇家坟墓的缩影   死亡 - 它包括一个走廊,一个墓室和一个未完成的人   第三室。

我尝试了以下内容,但它与下一个大写字母一起匹配:

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

我想:

  • 仅匹配.中的句点.Tomb - 后跟大写字母的任何点,
  • .3中的44.3m不匹配,
  • .t中的.cwww.thebanmappingproject.com不匹配。

3 个答案:

答案 0 :(得分:1)

你尝试过吗?

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

它将匹配任何点后跟大写字母

答案 1 :(得分: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]

这几乎不会成为世界末日。

答案 2 :(得分:0)

你非常接近。你只需要一个括号来匹配点和全局修饰符g来匹配每个点后跟一个大写字母,而不仅仅是第一个:

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