Da jedesmal den ganzen Text durchzusieben wird nicht funktionieren. Das heißt, man braucht ein System, den Text vielfach zu untergliedern und die einzelnen Sektoren einzeln zu 'verwalten'.
Entweder machst du das asynchron so etwa jede Sekunde über den gesammten Text, aber den zerlegten Text hast du ja eigentlich auch schon. Editierst du irgendwo, dann editierst du ja letztendlich einen Eintrag in deinem Array, musst also erst mal nur diesen updaten und neu auswerten. Bei manchen Sachen musst du zusätzlich die nächsten Bereiche mit auswerten (z.B. bei //) und seltener die davor (bei */).
Du musst nur im Text vermerkt haben, welchen Eintrag du gerade bearbeitest, z.B. als Data-Attribut.