简体   繁体   中英

How to get the particular part of string matching regexp in Ruby?

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 )?

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"]]

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"]

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

It changes the colon to a positive look-behind so that it does not appear in the output. Note that the colon alone is a metacharacter and so must be escaped with a backslash.

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)

Using IRB

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM