字符串结尾处的模式的正则表达式

时间:2014-08-18 21:45:16

标签: ruby regex

我有一个看起来像的字符串:

hello/world/1.9.2-some-text
hello/world/2.0.2-some-text
hello/world/2.11.0

通过正则表达式,我希望在最后一次获得字符串' /'直到行结束,即在上面的例子中,输出应该是1.9.2-some-text,2.0.2-some-text,2.11.0

我尝试了这个 - ^(.+)\/(.+)$,它返回了一个数组,其中第一个对象是" hello/world"第二个对象是" 1.9.2-some-text"

有没有办法获得" 1.9.2-some-text"作为输出?

4 个答案:

答案 0 :(得分:3)

尝试使用负面character class[^…]),如下所示:

[^\/]+$

这将匹配/以外的任何字符中的一个或多个,后跟字符串的结尾。

答案 1 :(得分:3)

你可以在这里使用否定的匹配。

'hello/world/1.9.2-some-text'.match(Regexp.new('[^/]+$'))
# => "1.9.2-some-text"

表示任何字符除外:/ 1 或更多次)后跟字符串的结尾。

虽然,最简单的方法是拆分字符串。

'hello/world/1.9.2-some-text'.split('/').last
# => "1.9.2-some-text"

OR

'hello/world/1.9.2-some-text'.split('/')[-1]
# => "1.9.2-some-text"

答案 2 :(得分:2)

如果您不需要使用正则表达式,那么执行此类操作的常用方法是:

File.basename("hello/world/1.9.2-some-text")
#=> "1.9.2-some-text"

答案 3 :(得分:1)

这是一种方式:

s = 'hello/world/1.9.2-some-text
hello/world/2.0.2-some-text
hello/world/2.11.0'

s.lines.map { |l| l[/.*\/(.*)/,1] }
  #=> ["1.9.2-some-text", "2.0.2-some-text", "2.11.0"]

你说,“在上面的例子中,输出应该是1.9.2-some-text, 2.0.2-some-text, 2.11.0”。那既不是字符串也不是数组,所以我假设你想要一个数组。如果你想要一个字符串,请将.join(', ')添加到最后。

正则表达式自然是“贪婪的”,因此.*\/将匹配所有字符,包括每行中的最后一个/1返回捕获组(.*)(捕获组1)的内容。