Digamos que tengo la cadena example_photo_name1.png y example_photo_name2.png . Quiero eliminar todo después de primero . y todo antes del ultimo _ . El resultado esperado es name1 y name2 .
Podría eliminar todo después de la primera . usando el patrón (.*)\.[^\.]*$ . Sin embargo, no sé cómo eliminar todo antes del último _ . ¿Cómo puedo hacer esto?
Podrías usar el patrón (?<=_)(?!.+_).+(?=\.)
Explicación del patrón:
(?<=_) - mirar atrás positivo - afirmar que lo que precede es un guión bajo
(?!.+_) - anticipación negativa - afirmar que lo que sigue no contiene ningún guión bajo (por lo que estamos seguros de que estamos justo detrás del último guión bajo)
.+ - coincide con uno o más de cualquier carácter
(?=\.) - afirma lo que sigue es un punto .
Demostración de expresiones regulares
El texto combinado será exactamente lo que desea.
Algo como esto podría funcionar:
const string = 'example_photo_name1.png'; string.replace(/^.*_(.*?)\.[^.]*$/, '$1'); Si desea que el prefijo xxx_ y el sufijo .xxx sean opcionales, puede envolverlos en grupos que no capturan y agregar el cuantificador adecuado:
/^(?:.*_)?(.*?)(?:\.[^.]*)?$/De esta manera cadena como:
hello_world => world world.jpg => worldEl (.*)\.[^\.]*$ patrón tuyo (usado con .replace y $1 ) elimina el último . y el resto de la cadena.
Puedes usar
text = text.replace(/^.*_|\..*/g, '')Vea la demostración de expresiones regulares . Detalles :
^.*_ - comienzo de una cadena, cualquier cero o más caracteres que no sean caracteres de salto de línea tantos como sea posible, y luego un carácter _| - o\..* - un punto y luego cero o más caracteres que no sean caracteres de salto de línea tantos como sea posibleVea una demostración de JavaScript:
const texts = ['example_photo_name1.png', 'example_photo_name2.png']; const re = /^.*_|\..*/g; for (const text of texts) { console.log(text, '=>', text.replace(re, '')) }