re = /(?imx)
(^\h*) # capture les espaces avant #cs (ex. < >#cs)
(
\# (?> cs|comments-start ) \b\N*\R # => #cs
# => commentaires (partie entre #cs et #ce)
(?:
# vérifie qu'il s'agit bien d'un commentaire
# c.-à-d. que le début de la ligne NE doit PAS être suivi par ce qui
# correspond à un début (#cs) ou fin de commentaire (#ce)
(?!
\h* \# (?> cs|comments-start|ce|comments-end ) \b\N*\R
)
# le commentaire
# un commentaire peut simplement être une nouvelle ligne (\R)
\N*\R
| # commentaire ou récursion (si aucun commentaire trouvé)
# récursion (depuis le début) pour chercher un nouveau #cs
(?R)
)* # les commentaire sont facultatifs
\h* \# (?> ce|comments-end ) # => #ce
\b\N*? # texte après #ce, facultatif (ex. #ce< TEXTE>)
)
# capture, s'il y en a, les espaces et la fin de ligne après #ce (ex. #ce blabla...< \R>)
(
\h*+ $ # espaces après #ce ; seulement ceux avant la fin de ligne (ex. #ce blabla...< >$)
\R? # retour à la ligne facultatif
)/imx
str = ' #cs xyz
gna
#cs xyz
gna gna
#ce #ce
#ce #ce
#ce
#cs xyz
gna gna
#ce xyz
-------------------------------------
#cs
...
#
#cs
#cs
#cs
...
#cs
...
#ce
#ce
#ce
#ce
;#ce
#ce
#ce
-------------------------------------
#comments-start BON
...
#
#cs
...
#cs
...
#ce
#ce
...
#ce
-------------------------------------
#comments-start BON
...
#
#comments-start
...
#cs
...
#comments-end
#ce
...
#comments-end
#comments-end
-------------------------------------
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce
#cs
;#cs
;#ce
#ce i
#cs
;#cs
;#ce
#ce i
#cs
;#cs
;#ce
#ce i
-------------------------------------
#cs,test
...
#cs...
.#cs.. NE_PAS_CAPTURER
#ceNE_PAS_CAPTURER
...
#ce
#ce
#ce
-------------------------------------
#cs
#ce
#comments-start
...
#
#cs
#cs
...
#cs---
...
#
# ce NE_PAS_CAPTURER
#ce
#ce
#ce
#ce
#ce
...
-------------------------------------
--------- [NE PAS CAPTURER] ---------
#ce
#ce
#ce
#cs
#cs
#cs
#cs
#cs
#cs
'
subst = '[\\1]<span class="S2">\\2</span>[\\3]'
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