tags:

views:

33

answers:

5

I've got a string Unnecessary:12357927251data and I need to select all data after colon and numbers. I will do it using Regexp.

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

This will give me :12357927251data, but can I select only needed information .+ (data)?

+2  A: 

Anything in parentheses in a regexp will be captured as a group, which you can access in $1, $2, etc. or by using [] on a match object:

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

If you use scan with capturing groups, you will get an array of arrays of the groups:

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

Try this: /(?<=:)\d+.+$/

It changes the colon to a positive look-behind so that it does not appear in the output.

huntaub
I get error `SyntaxError: compile errorundefined (?...) sequence: /(?<=:)\d+.+$/`
Semyon Perepelitsa
Haha. Ruby's Regular Expression engine probably does not implement look behinds then. The other answers will get you through the problem, though.
huntaub
+1  A: 

Use parenthesis in your regular expression and the result will be broken out into an array. For example:

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

Using IRB

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

Assuming that you are trying to get the string 'data' from your string, then you can use:

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

String#match returns a MatchData object. You can then index into that MatchData object to find the part of the string that you want.

(The first element of MatchData is the original string, the second element is the part of the string captured by the parentheses)

Snorkpete