const regex = new RegExp('(?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
)', 'img')
const 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
`;
const subst = `[\1]<span class="S2">\2</span>[\3]`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', 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 JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions