Me gustaría hacer coincidir los comentarios hash excluyendo los comentarios en línea en PowerShell. Puedo unirlos usando #(?<!<#)(?![<>])(.*)$ (ver regex101 ). Sin embargo, me gustaría lograr esto al no usar lookbehind. ¿Hay alguna manera de que pueda obtener el mismo comportamiento (o el más cercano) a la expresión regular con mirar atrás?
Una solución de expresiones regulares sería buena, pero también agradecería las soluciones de JavaScript.
Lo mejor que pude fue probar #(?!.*>)(.*)$ (ver regex101 ), pero no estoy contento de que se pierda todo lo que tiene > después de # .
También intenté escribir JavaScript solo analizando pero se volvió muy complejo (más de 30 líneas, ver pastebin ) y fue muy lento.
Lo uso para usar PowerShell en línea en un proyecto de código abierto ( código de GitHub ). Sin embargo, el proyecto está en línea y se ejecuta en el navegador ( sitio web ) y, lamentablemente, me di cuenta de que no funciona en Safari, ya que Safari aún no es compatible con lookbehind ( caniuse.com ).
Regla: haga coincidir todos los comentarios hash pero excluya los comentarios en línea
Los comentarios hash en PowerShell, al igual que en bash y otros idiomas, comienzan desde hash ( # ) y continúan hasta el final de la línea.
Write-Host "Hello world" # Here is a hash comment Los comentarios en línea en PowerShell están entre <# y #>
Write-Host <# Here is an inline comment #> "Hello world"Podría hacer coincidir la siguiente expresión regular.
^(?:<#.*?#>|[^#])*(#.*)?El grupo de captura, si no está vacío, contiene el comentario que se eliminará.
Pase el cursor sobre cada elemento de la expresión en el enlace para obtener una descripción de su función.
Con las expresiones regulares, que representan patrones de texto sin formato, no solo puede hacer coincidir fragmentos de texto, sino que también puede capturar partes de las coincidencias. Una vez que captura una subcadena, puede aplicar cualquier lógica que desee después de eso, ya sea reemplazando o conservando partes de la cadena.
Para reemplazar los comentarios, puede usar
text = text.replace(/(<#.*?#>)|#.*/g, (m, g) => g ? g : "REPLACED")Para eliminar los comentarios, puede utilizar
text = text.replace(/(<#.*?#>)|#.*/g, "$1") En ambos casos, el patrón es (<#.*?#>)|#.* :
(<#.*?#>) - Grupo 1: un texto <# , luego cero o más caracteres que no sean caracteres de salto de línea, la menor cantidad posible y luego texto #>| - o#.* - # char y el resto de la línea. En el primer caso, (m, g) => g ? g : "REPLACED" g (m, g) => g ? g : "REPLACED" mantiene el valor del grupo 1 si el Grupo 1 coincide ( m representa la coincidencia completa y g representa el valor del Grupo 1). En el segundo caso, el valor del Grupo 1 se vuelve a colocar si coincidió con la ayuda de la referencia inversa $1 . Representa una cadena vacía si el Grupo 1 no coincide.