代码之家  ›  专栏  ›  技术社区  ›  tomatito

用ruby将文本“job task”转换为“job_task”

  •  0
  • tomatito  · 技术社区  · 7 年前

    我有这些弦:

    "job_task"
    "employ_task"
    "post_task"
    

    使用:

    22] pry(main)> j = "job_task".classify
    => "JobTask"
    

    我想得出相反的结果:

    发件人:

    "JobTask"
    "EmployTask"
    "PostTask"
    

    我想得到:

    “作业任务”
    “使用任务”
    “发布任务”
    

    谢谢您!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Cary Swoveland    7 年前
    def convert(str)
      str.gsub(/\p{Ll}?\p{Lu}/) {|s| (s.size == 1 ? "" : "#{s[0]}_") + "#{s[-1].downcase}"}
    end
    
    convert("JobTask")    #=> "job_task"
    convert("EmployTask") #=> "employ_task"
    convert("PostTask")   #=> "post_task"
    

    /\p{Ll}/ /\p{Lu}/ 分别匹配小写和大写字母。参见[regexp]。( http://ruby-doc.org/core-2.4.0/Regexp.html(search 对于 "\p{Lu}" )。

    可以读取正则表达式,“可选地匹配小写字母和(必需的)大写字母。”如果只匹配一个字符(字符串的第一个字母), s[-1] s .

    用于

    str = "JobTask"
    

    块转换 "J" "j" "T" "_t" 以下内容:

    一个懒惰的选择是:

    def convert(str)
      str.gsub(/\p{Lu}/) { |s| "_#{s.downcase}" }[1..-1]
    end
    

    在这里

    "JobTask".gsub(/\p{Lu}/) { |s| "_#{s.downcase}" }
      # => "_job_task"
    

    [1..-1] 返回不带前导下划线的字符串。

    推荐文章