代码之家  ›  专栏  ›  技术社区  ›  Simon Perepelitsa

如何在Ruby中获取字符串匹配regexp的特定部分?

  •  11
  • Simon Perepelitsa  · 技术社区  · 14 年前

    我有根绳子 Unnecessary:12357927251data 我需要选择冒号和数字之后的所有数据。我将使用regexp来完成它。

    string.scan(/:\d+.+$/)
    

    这会给我 :12357927251data ,但我能选择只需要的信息吗? .+ ( data )?

    5 回复  |  直到 10 年前
        1
  •  20
  •   mckeed    14 年前

    regexp中括号内的任何内容都将捕获为一个组,您可以在 $1 , $2 或通过使用 [] 在匹配对象上:

    string.match(/:\d+(.+)$/)[1]
    

    如果将扫描与捕获组一起使用,将获得组的数组:

    "Unnecessary:123data\nUnnecessary:5791next".scan(/:\d+(.+)$/)
    => [["data"], ["next"]]
    
        2
  •  3
  •   bta    14 年前

    在正则表达式中使用括号,结果将被分解成一个数组。例如:

    x='Unnecessary:12357927251data'
    x.scan(/(:\d+)(.+)$/)
    => [[":12357927251", "data"]]
    x.scan(/:\d+(.+$)/).flatten
    => ["data"]
    
        3
  •  1
  •   snorkpete    14 年前

    假设您试图从字符串中获取字符串“data”,则可以使用:

    string.match(/.*:\d*(.*)/)[1]
    

    string match返回matchdata对象。然后可以索引到MatchData对象中,以找到所需的字符串部分。

    (matchdata的第一个元素是原始字符串,第二个元素是由括号捕获的字符串的一部分)

        4
  •  1
  •   AJF    10 年前

    试试这个: /(?<=\:)\d+.+$/

    它将冒号更改为后面的正查找,这样它就不会出现在输出中。请注意,仅冒号是元字符,因此必须用反斜杠转义。

        5
  •  0
  •   Dogbert    14 年前

    使用IRB

    irb(main):004:0> "Unnecessary:12357927251data".scan(/:\d+(.+)$/)
    => [["data"]]