Estaba buscando una expresión regular que coincidiera con la primera fecha que NO es seguida por una línea que comienza con la letra 'R' (quiero obtener la última fecha de confirmación de git log , excepto solo para las confirmaciones de cambio de ruta).
2021-12-07T16:39:43+01:00 M test.md 2021-12-07T16:18:59+01:00 R100 old.test.md test.md 2021-12-07T15:37:15+01:00 A old.test.mdDespués de una lucha significativa, obtengo esta expresión regular (no me importa mucho la validez de la fecha, confío en Git):
/20[\dT:.Z+]+(?:\r?\n)(?!R)/ Funciona bastante bien, pero deja un carácter de nueva línea final \n . No es gran cosa, puede ser reparado; pero encadenar de forma segura la match con replace hace que el código sea increíblemente feo (estoy usando Node.js):
import { execSync } from "child_process" const allAuthorDates = execSync( `git log --follow --name-status --pretty=format:%aI -- test.md` ).toString() const lastEditExceptPathChangeDateMatch = allAuthorDates.match( /20[\dT:.Z+]+(?:\r?\n)(?!R)/ ) console.log(lastEditExceptPathChangeDateMatch) /* [ '2021-12-07T16:39:43+01:00\n', <-- how to get rid of that \n? index: 0, input: '2021-12-07T16:39:43+01:00\nA\ttest.md\n', groups: undefined ] */ Debido al carácter de nueva línea final, me veo obligado a usar el horrible let result = (str.match(/…/) || [""])[0].replace(…) está ahí para evitar el error de tiempo de ejecución en ( probablemente poco probable) en caso de que la coincidencia devuelva null .
¿Alguien sería tan amable de aconsejarme cómo editar la expresión regular para deshacerme del \n final durante la coincidencia, para hacer que el siguiente replace sea innecesario?
Debe hacer coincidir el final de la línea con $ (asegurándose de agregar la bandera m ) y luego usar la anticipación negativa con el patrón \r?\n movido a la anticipación justo antes de R :
/20[\dT:.Z+]+$(?!\r?\nR)/mVea esta demostración de expresiones regulares . O, si quieres deletrear el patrón:
/^20\d{2}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$(?!\r?\nR)/gm Aquí, también agregué la bandera g para que coincida con múltiples ocurrencias. Vea esta demostración de expresiones regulares .
La parte $(?!\r?\nR) coincide con la posición anterior al carácter CR o LF (retorno de carro o avance de línea) y luego se asegura de que no haya un carácter CR opcional, un carácter LF y R inmediatamente a la derecha del carácter actual. ubicación.