re = /(?:is listening to|is watching|is playing|is editing) \[https?:\/\/osu.ppy.sh(\/beatmapsets\/(\d+)(#([a-z]+)?\/?(\d+))?|\/(b|s)\/(\d+)).*\]((?: (?:-Easy|-NoFail|-HalfTime|\+HardRock|\+SuddenDeath|\+Perfect|\+DoubleTime|\+Nightcore|\+Hidden|\+Flashlight|~Relax~|~AutoPilot~|-SpunOut|\|Autoplay\|))*)/m
str = '* ekgame is listening to [https://osu.ppy.sh/beatmapsets/1989906#osu/4133938 TUYU - Ame o Abiru]
* ekgame is listening to [https://osu.ppy.sh/beatmapsets/1989906#fruits/4139282 TUYU - Ame o Abiru]
* ekgame is listening to [https://osu.ppy.sh/beatmapsets/1989906#osu/4133938 TUYU - Ame o Abiru] +HardRock ~Relax~
* ekgame is listening to [https://osu.ppy.sh/b/4133938 TUYU - Ame o Abiru]
* ekgame is listening to [https://osu.ppy.sh/s/1989906 TUYU - Ame o Abiru]
'
# 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