Si tenemos la siguiente cadena:
"hukhkhk\nClosing Date: Friday 22nd April 2022\nwdwqdwqdwqd\nClosing Date: Friday 22nd April 2023\newdewfewf"
y queremos obtener las 2 fechas "Friday 22nd April 2022" y "Friday 22nd April 2023"
¿Cómo hago para recuperar una matriz de todas las cadenas capturadas usando js?
[ "Friday 22nd April 2022", "Friday 22nd April 2023" ]
Hay un problema en mi expresión regular, pero no estoy seguro de cómo solucionarlo para que no coincida con todo lo que se encuentra entre el primer \n que encuentra:
(?<=Closing Date:\s)(.*)(?=\\n)
El js que probé es este:
var reg = new RegExp('(?<=Closing Date: )(.*)(?=\\n)/g'); reg.exec("hukhkhk\nClosing Date: Friday 22nd April 2022\nwdwqdwqdwqd\nClosing Date: Friday 22nd April 2023\newdewfewf")Un enfoque alternativo para sus datos de ejemplo, y cualquier dato con un marcador fácilmente definible para el texto requerido, sería split los datos en una matriz de líneas (marcadas en \n ), aplicar un filter de matriz a la matriz para eliminar elementos no que contiene la cadena de marcador y, finalmente, .map la matriz para que contenga solo la parte requerida que sigue a la cadena de marcador.
Los procesos se pueden unir en una sola línea como se demuestra en el siguiente fragmento:
string = "hukhkhk\nClosing Date: Friday 22nd April 2022\nwdwqdwqdwqd\nClosing Date: Friday 22nd April 2023\newdewfewf"; markerString = "Closing Date: "; datesArray = string.split('\n').filter(text => text.indexOf(markerString) > -1).map(text => text.slice(text.indexOf(markerString)+ markerString.length)); console.log(datesArray)(?<=Closing Date: )(.*?)(?=\\n)
Empieza a coincidir después de la Closing Date: (espacio incluido)
Deja de coincidir antes del primer \n que encuentra
Esto funcionó en tu ejemplo
group names (no se usaban y marcaban una gran diferencia en el tiempo de ejecución)split() const input = "hukhkhk\\nClosing Date: Friday 22nd April 2022\\nwdwqdwqdwqd\\nClosing Date: Friday 22nd April 2023\\newdewfewf"; const regex = /(?:(?:\\n|^).*?(?:\\n|$))(?:Closing\sDate:\s)?/mg const dates = input.split(regex).filter(date => date.length > 0); console.log(dates);Afuera:
[ 'Friday 22nd April 2022', 'Friday 22nd April 2023' ]Usando expresiones regulares para encontrar todo el contenido sin fecha:
const re = /(?<junk>(?:\\n|^).*?(?:\\n|$))(?<delimiter>Closing Date: )?/gmLuego, use JS split para obtener una matriz solo con fechas
const dates = input.split(re);