Regex para comentarios en cadenas, cadenas en comentarios, etc.

Esta es una pregunta que he resuelto y quería publicar en estilo de preguntas y respuestas porque creo que más personas podrían usar la solución. O tal vez mejorar la solución, mostrar dónde se rompe.

El problema

Desea hacer algo con cadenas y / o comentarios entre comillas en un cuerpo de texto. Quieres extraerlos, destacarlos, ¿qué tienes? Pero algunas cadenas citadas están dentro de los comentarios, y algunas veces los caracteres de comentario están dentro de las cadenas. Y los delimitadores de cadenas se pueden escapar, y los comentarios pueden ser comentarios de línea o bloquear comentarios. Y cuando pensaste que tenías una solución, alguien se queja de que no funciona cuando hay un literal regex en su JavaScript. ¿Qué hacer?

Ejemplo concreto

var ret = row.match(/'([^']+)'/i); // Get 1st single quoted string's content if (!ret) return ''; /* return if there's no matches Otherwise turn into xml: */ var message = '\t'; alert('xml: \'' + message + '\''); /* alert("xml: '" + message + "'"); // */ var line = prompt('How do line-comments start? (eg //)', '//'); // do something with line 

Este código no tiene sentido, pero ¿cómo hago lo correcto en cada uno de los casos del JavaScript anterior?

Lo único que encuentro que se acerca es esto: comentarios en cadenas y cadenas en los comentarios donde el propio Jan Goyvaerts respondió con un enfoque similar. Pero ese no maneja el apóstrofo-escapando todavía.

He dividido la expresión regular en 4 líneas correspondientes a las 4 rutas en el gráfico, no guardes esos saltos de línea si alguna vez usas esto.

 (['"])(?:(?!\1|\\).|\\.)*\1| \/(?![*/])(?:[^\\/]|\\.)+\/[igm]*| \/\/[^\n]*(?:\n|$)| \/\*(?:[^*]|\*(?!\/))*\*\/ 

Visualización de expresión regular

Demostración de Debuggex

Este código toma 4 tipos de “bloques” que pueden contener los otros 3. Puedes repetir esto y hacer con cada uno lo que quieras o descartarlo porque no es a él a lo que quieres hacer nada.

Este es específico para JavaScript, ya que es un idioma con el que estoy familiarizado. Pero podría adaptarlo fácilmente al idioma de su preferencia.

¿Alguien ve una forma en que se rompe este código?

Editar Desde entonces, me han notificado que el patrón general se describe muy bien aquí: https://stackoverflow.com/a/23589204/2684660 , neato!