类 String

公共实例方法

ext(newext="") 点击切换源代码

将文件扩展名替换为 newext。如果字符串没有扩展名,则将新扩展名追加到末尾。如果未给出新扩展名或为空字符串,则删除任何现有的扩展名。

ext 是为 String 类添加的用户方法。

String 扩展来自 Rake

# File rake-13.2.1/lib/rake/ext/string.rb, line 14
def ext(newext="")
  return self.dup if [".", ".."].include? self
  if newext != ""
    newext = "." + newext unless newext =~ /^\./
  end
  self.chomp(File.extname(self)) << newext
end
pathmap(spec=nil, &block) 点击切换源代码

根据给定的规范映射路径。该规范控制映射的细节。以下特殊模式被识别:

%p

完整路径。

%f

路径的基本文件名,包括其文件扩展名,但不包括任何目录。

%n

路径的文件名,不包括其文件扩展名。

%d

路径的目录列表。

%x

路径的文件扩展名。如果没有扩展名,则为空字符串。

%X

除了文件扩展名之外的所有内容。

%s

如果定义了备用文件分隔符,则使用它,否则使用标准文件分隔符。

%%

%

%d 说明符还可以有一个数字前缀(例如 ‘%2d’)。如果数字为正数,则只返回路径中(最多)n 个目录,从左侧开始。如果 n 为负数,则从路径的右侧返回(最多)n 个目录。

示例

'a/b/c/d/file.txt'.pathmap("%2d")   => 'a/b'
'a/b/c/d/file.txt'.pathmap("%-2d")  => 'c/d'

此外,%d%p%f%n%x%X 运算符可以接受模式/替换参数,以对路径的特定部分执行简单的字符串替换。模式和替换之间用逗号分隔,并用大括号括起来。替换规范位于 % 字符之后,但在运算符字母之前。(例如,“%{old,new}d”)。多个替换规范应以分号分隔(例如,“%{old,new;src,bin}d”)。

正则表达式可以用于模式,并且反向引用可以用于替换文本。大括号、逗号和分号都排除在模式和替换文本之外(让我们保持解析合理)。

例如

"src/org/onestepback/proj/A.java".pathmap("%{^src,class}X.class")

返回

"class/org/onestepback/proj/A.class"

如果替换文本是“*”,则可以提供一个块来执行替换的一些任意计算。

例如

"/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext|
   ext.downcase
}

返回

"/path/to/file.txt"

String 扩展来自 Rake

# File rake-13.2.1/lib/rake/ext/string.rb, line 138
def pathmap(spec=nil, &block)
  return self if spec.nil?
  result = "".dup
  spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag|
    case frag
    when "%f"
      result << File.basename(self)
    when "%n"
      result << File.basename(self).ext
    when "%d"
      result << File.dirname(self)
    when "%x"
      result << File.extname(self)
    when "%X"
      result << self.ext
    when "%p"
      result << self
    when "%s"
      result << (File::ALT_SEPARATOR || File::SEPARATOR)
    when "%-"
      # do nothing
    when "%%"
      result << "%"
    when /%(-?\d+)d/
      result << pathmap_partial($1.to_i)
    when /^%\{([^}]*)\}(\d*[dpfnxX])/
      patterns, operator = $1, $2
      result << pathmap("%" + operator).pathmap_replace(patterns, &block)
    when /^%/
      fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'"
    else
      result << frag
    end
  end
  result
end
pathmap_explode() 点击切换源代码

将路径分解为各个组件。由 pathmap 使用。

String 扩展来自 Rake

# File rake-13.2.1/lib/rake/ext/string.rb, line 27
def pathmap_explode
  head, tail = File.split(self)
  return [self] if head == self
  return [tail] if head == "." || tail == "/"
  return [head, tail] if head == "/"
  return head.pathmap_explode + [tail]
end
pathmap_partial(n) 点击切换源代码

从路径中提取部分路径。如果 n 为正数,则从前端(左侧)包括 n 个目录。如果 n 为负数,则从后端(右侧)包括 |n| 个目录。

String 扩展来自 Rake

# File rake-13.2.1/lib/rake/ext/string.rb, line 41
def pathmap_partial(n)
  dirs = File.dirname(self).pathmap_explode
  partial_dirs =
    if n > 0
      dirs[0...n]
    elsif n < 0
      dirs.reverse[0...-n].reverse
    else
      "."
    end
  File.join(partial_dirs)
end
pathmap_replace(patterns, &block) 点击切换源代码

对给定路径执行 pathmap 替换操作。模式采用“pat1,rep1;pat2,rep2…”的形式。

String 扩展来自 Rake

# File rake-13.2.1/lib/rake/ext/string.rb, line 59
def pathmap_replace(patterns, &block)
  result = self
  patterns.split(";").each do |pair|
    pattern, replacement = pair.split(",")
    pattern = Regexp.new(pattern)
    if replacement == "*" && block_given?
      result = result.sub(pattern, &block)
    elsif replacement
      result = result.sub(pattern, replacement)
    else
      result = result.sub(pattern, "")
    end
  end
  result
end