re = /(?<scheme>[^!$&'()*,;=@\/\/:\s]+):(?<authority>\/\/(?<userinfo>(?<username>[\w\.\-!$&'()*,;=]+):?(?<password>[\w\.\-!$&'()*,;=]+)?@)?(?<host>[^\s\n\t\r\/:\[\]]+|\[[^\s\n\t\r\/:\[\]]+\]):?(?<port>\d{1,5})?)?[\/]?(?<path>[^\s\?#]{1,}(?:\?(?<query>[^\s#]+))?(?:#(?<fragment>[^\s]+))?)?/
str = 'example from wikipedia URI:
userinfo host port
┌─┴─────┐
user pass
┌──┴───────┴───┐┌──────┴──────┐ ┌┴─┐
https://john.doe:example@www.example.com:1234/forum/questions/?tag=networking&order=newest#top
└─┬─┘ └─────────────┬─────────────┘└───────┬───────┘ └────────────┬────────────┘ └┬┘
scheme authority path query fragment
userinfo host port
┌──┴───┐ ┌──────┴──────┐ ┌┴─┐
https://john.doe@www.example.com:1234/forum/questions/?tag=networking&order=newest#:~:text=whatever
└─┬─┘ └─────────────┬─────────────┘└───────┬───────┘ └────────────┬────────────┘ └───────┬───────┘
scheme authority path query fragment
ldap://[2001:db8::7]/c=GB?objectClass?one
└┬─┘ └─────┬─────┘└─┬─┘ └──────┬──────┘
scheme authority path query
mailto:John.Doe@example.com
└─┬──┘ └────┬─────────────┘
scheme path
news:comp.infosystems.www.servers.unix
└┬─┘ └─────────────┬─────────────────┘
scheme path
tel:+1-816-555-1212
└┬┘ └──────┬──────┘
scheme path
telnet://192.0.2.16:80/
└─┬──┘ └─────┬─────┘│
scheme authority path
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
└┬┘ └──────────────────────┬──────────────────────┘
scheme path'
# Print the match result
str.scan(re) do |match|
puts match.to_s
end
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html