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

时间:2010-06-22 15:49:50

标签: ruby

我有一个字符串Unnecessary:12357927251data,我需要在冒号和数字后选择所有数据。我会用Regexp来做。

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

这会给我:12357927251data,但我是否只能选择所需信息.+data)?

5 个答案:

答案 0 :(得分:20)

正则表达式中括号中的任何内容都将作为一个组捕获,您可以在$1$2等中或在匹配对象上使用[]来访问该组:

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

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

"Unnecessary:123data\nUnnecessary:5791next".scan(/:\d+(.+)$/)
=> [["data"], ["next"]]

答案 1 :(得分:3)

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

x='Unnecessary:12357927251data'
x.scan(/(:\d+)(.+)$/)
=> [[":12357927251", "data"]]
x.scan(/:\d+(.+$)/).flatten
=> ["data"]

答案 2 :(得分:1)

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

它将冒号更改为正向后视,以便它不会出现在输出中。请注意,仅冒号是元字符,因此必须使用反斜杠进行转义。

答案 3 :(得分:1)

假设您正在尝试从字符串中获取字符串'data',那么您可以使用:

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

String#match返回MatchData对象。然后,您可以索引到该MatchData对象以查找所需字符串的一部分。

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

答案 4 :(得分:0)

使用IRB

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