re = /(?<=^|[^_])__(((\\_)|((?![\s_])(?:(?:[^_]|_(?!_))+?)?[^\s_]))+)__(?=[^_]|$)/m
str = '-- funciona
__foo bar__
__f o o b a r__
**teste __lorem ipsum__ dolor sit**
__teste **lorem ipsum** dolor sit__
abc__xyz__teste
-- não funcionava na primeira versão
__foo_bar__
__a__
__*__
__foo_*bar__
-- não é para funcionar
__ foo bar__
__foo bar __
_foo__
__ foo __
_foo_
__foo_
__ __
__a____
____a__
_____
-- corner case: aninhado (não tratei pois não sei o que deveria fazer)
__abc__xyz__123__
__abc __xyz__ 123__
-- corner case: escape (chega a reconhecer alguns casos, mas não substitui "\\_" por "_"
__\\___
__a\\___
__abc\\___
__\\_abc_\\__ -- errado, mas não consegui tratar'
subst = '<i>\\1<\\i>'
result = str.gsub(re, subst)
# Print the result of the substitution
puts result
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