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年之后试图忽略'/'时它不起作用。我该怎么做?
答案 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"