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

字符串末尾模式的正则表达式

  •  0
  • tech_human  · 技术社区  · 12 年前

    我有一个字符串,看起来像:

    hello/world/1.9.2-some-text
    hello/world/2.0.2-some-text
    hello/world/2.11.0
    

    通过正则表达式,我希望得到最后一个“/”之后的字符串,直到行尾,即,在上面的示例中,输出应该是1.9.2-some-text,2.0.2-some-ttext,2.11.0

    我试过了- ^(.+)\/(.+)$ 它将返回第一个对象的数组“ hello/world “第二个对象是” 1.9.2-some-text "

    有没有一种方法可以将“1.9.2-some-text”作为输出?

    4 回复  |  直到 12 年前
        1
  •  3
  •   p.s.w.g    12 年前

    尝试使用负片 character class ( [^…] )像这样:

    [^\/]+$
    

    这将匹配除 / 然后是字符串的结尾。

        2
  •  3
  •   hwnd    12 年前

    你可以在这里使用否定匹配。

    'hello/world/1.9.2-some-text'.match(Regexp.new('[^/]+$'))
    # => "1.9.2-some-text"
    

    指除以下字符外的任何字符: / ( 1. 或更多次),后跟字符串的结尾。

    不过,最简单的方法是拆分字符串。

    'hello/world/1.9.2-some-text'.split('/').last
    # => "1.9.2-some-text"
    

    或

    'hello/world/1.9.2-some-text'.split('/')[-1]
    # => "1.9.2-some-text"
    
        3
  •  2
  •   sawa    12 年前

    如果您不需要使用正则表达式,通常的做法是:

    File.basename("hello/world/1.9.2-some-text")
    #=> "1.9.2-some-text"
    
        4
  •  1
  •   Cary Swoveland    12 年前

    这是一种方式:

    s = 'hello/world/1.9.2-some-text
    hello/world/2.0.2-some-text
    hello/world/2.11.0'
    
    s.lines.map { |l| l[/.*\/(.*)/,1] }
      #=> ["1.9.2-some-text", "2.0.2-some-text", "2.11.0"]
    

    您说过,“在上面的示例中,输出应该是 1.9.2-some-text, 2.0.2-some-text, 2.11.0 “。这既不是字符串也不是数组,所以我假设你想要一个数组。如果你想要字符串 .join(', ') 到最后。

    Regex的天生“贪婪”,所以 .*\/ 将匹配最后一个字符(包括最后一个) / 在每一行中。 1 返回捕获组的内容 (.*) (捕捉组1)。