我如何忽略Ruby Regular Expression中的斜杠

时间:2017-03-28 22:29:01

标签: ruby regex

a = 'CS 141 FALL 2016/SessionData/L1609211319.xml'
Class = a.match(/(.*)SessionData/)
class = Class.to_s 
puts "Class is " + class 

当我尝试匹配该字符串的正则表达式时,它给了我“CS 141 FALL 2016 /”当我在2016年之后试图忽略'/'时它不起作用。我该怎么做?

1 个答案:

答案 0 :(得分:1)

以下是需要考虑的事项:网址包含“路径”,可以使用URI轻松提取该路径,然后使用File's methods进行管理。

require 'uri'

uri = URI.parse('http://example.com/path/to/a/resource.xml')
the_path = uri.path # => "/path/to/a/resource.xml"
File.split(the_path) # => ["/path/to/a", "resource.xml"]
File.basename(the_path) # => "resource.xml"
File.extname(the_path) # => ".xml"
File.basename(the_path, File.extname(the_path)) # => "resource"
File.dirname(the_path) # => "/path/to/a"
File.absolute_path('..', the_path) # => "/path/to/a"

有更多可用的方法,但这可以让我们了解可以做什么而不必弄脏。

您也可以从字符串的split开始:

the_path.split('/') # => ["", "path", "to", "a", "resource.xml"]

然后抓住那些块。

把它全部带回家:

the_path = 'CS 141 FALL 2016/SessionData/L1609211319.xml'
File.split(the_path) # => ["CS 141 FALL 2016/SessionData", "L1609211319.xml"]
File.basename(the_path) # => "L1609211319.xml"
File.extname(the_path) # => ".xml"
File.basename(the_path, File.extname(the_path)) # => "L1609211319"
File.dirname(the_path) # => "CS 141 FALL 2016/SessionData"

the_path.split('/') # => ["CS 141 FALL 2016", "SessionData", "L1609211319.xml"]

当然:

the_path.split('/').first # => "CS 141 FALL 2016"

正则表达式很好,但通常有一些有效的方法可以在不诉诸它们的情况下做某事。如果你坚持:

the_path = 'CS 141 FALL 2016/SessionData/L1609211319.xml'
the_path[ %r#^([^/]+)# ] # => "CS 141 FALL 2016"

Ruby的%r文字定义分隔符内的任何内容作为正则表达式。 Regexp documentation说:

  

使用/.../%r{...}文字以及Regexp::new构造函数创建正则表达式。

知道这一点,很容易绕过以/.../作为分隔符的倾斜牙签综合症,如果它们在模式内,则迫使需要逃脱分隔符。这相当于只提示等待粗心的龙:

the_path[ /^([^\/]+)/ ] # => "CS 141 FALL 2016"