需要在Ruby中使用regex获取服务器名称

时间:2015-08-24 19:28:23

标签: ruby regex

我有一些VMware服务器工具可以从我们托管的所有虚拟机的VMware服务器返回一个字符串。我使用Ruby并且需要获取所有主机名,但是,当我这样做时,字符串看起来像这样:

=>"/vmfs/volumes/d9a12362-2cc7sfe/server1/server1.vmx"

是否有正则表达式将字符串替换为最后一个“/”和“.vmx”之间的内容?

4 个答案:

答案 0 :(得分:3)

有两种甜蜜的方法。

string = "/vmfs/volumes/d9a12362-2cc7sfe/server1/server1.vmx"
File.extname(string) # => '.vmx'
File.basename(string, File.extname(string)) # => "server1"

答案 1 :(得分:0)

如果您想使用regex,可以使用gsubsub执行此操作:

s = '=>"/vmfs/volumes/d9a12362-2cc7sfe/server1/server1.vmx"'
result = s.gsub(/(?mi)(=>".+\/)(.+)(\.vmx")/, '\1new\3')

<强>结果

=>"/vmfs/volumes/d9a12362-2cc7sfe/server1/new.vmx"

答案 2 :(得分:0)

我不担心使用正则表达式。 Ruby有一些简单的方法:

path = "/vmfs/volumes/d9a12362-2cc7sfe/server1/server1.vmx"
dir, basename = File.split(path)
File.join(dir, 'foo' + File.extname(basename)) 
# => "/vmfs/volumes/d9a12362-2cc7sfe/server1/foo.vmx"

正则表达式很强大,但这种力量是有代价的:

  • 它们很难维护,特别是当它们变得更加复杂时。
  • 他们真的会耗费CPU时间,特别是当他们做错事或不够明确时。
  • 他们可以打开逻辑漏洞导致不良结果,所以我们必须仔细测试它们。

但你的问题并不完全清楚:

  

...用最后一个&#34; /&#34;之间的内容替换字符串和&#34; .vmx&#34;?

可能意味着您要使用basename减去扩展名替换整个路径:

path = File.basename(path, File.extname(path)) 
# => "server1"

答案 3 :(得分:0)

你可以这样做:

string = "/vmfs/volumes/d9a12362-2cc7sfe/server1/server1.vmx"
new_string = string.split("/")[-1].gsub(".vmx","")

这样你就不需要使用正则表达式