Tengo una cadena como:
Webcam recording https://www.example.com/?id=456&code=123o como:
Webcam recording https://www.example.com/?id=456&code=123<br><b>test<b> Para extraer la URL del primer ejemplo que usé: var reg_exUrl = /\bhttps?:\/\/[^ ]+/g;
Ahora traté de extender Regex para que tome la primera coincidencia hasta el espacio en blanco (final de línea) o la etiqueta <br> .
Este fue mi intento:
var reg_exUrl = /\b(https?:\/\/[^ ]+)(\<br\>)/g;Lo que se ve bien en https://regex101.com/r/gudNab/1 y aparece como dos coincidencias diferentes.
Pero al usar Regex en Javascript, la etiqueta <br> siempre se incluye en el enlace.
Usando var matches = line.match(reg_exUrl); me da con matches[0] :
https://www.example.com/?id=456&code=123<br> en lugar del deseado https://www.example.com/?id=456&code=123
Si desea seleccionar texto antes de <br> , puede usar una búsqueda anticipada positiva. https?:\/\/.*?(?=<br>)
Agregar $ y \n para un final anticipado de la entrada: https?:\/\/.*?(?=<br>|$|\n)
const regexp = /https?:\/\/.*?(?=<br>|$|\n)/; const testString = "Webcam-Aufnahme https://www.example.com/file?id=959559110184937375.mp4&code=4yrn1ev<br>**test**"; console.log(testString.match(regexp)[0])Ver en regex101
Obtiene la coincidencia completa ya que está usando matches[0] pero tiene 2 grupos de captura donde la parte sin <br> está en el grupo de captura 1.
Puede obtener ese valor de grupo usando coincidencia si elimina el indicador global /g .
var line = "Webcam recording https://www.example.com/?id=456&code=123<br><b>test<b>\n"; var reg_exUrl = /\b(https?:\/\/[^ ]+)(\<br\>)/; var matches = line.match(reg_exUrl); console.log(matches[1]); Si desea que ambos ejemplos coincidan, puede usar un patrón sin un cuantificador no codicioso mediante el uso de una clase de carácter negado que coincida con cualquier carácter excepto < , y solo coincida si no está seguido directamente por br>
El patrón coincide:
\bhttps?:\/\/[^\s<]* Opcionalmente, haga coincidir cualquier carácter excepto un carácter de espacio en blanco o <(?: grupo de no captura<(?!br>) Coincide con < si no le sigue directamente br>[^\s<]* Opcionalmente, haga coincidir cualquier carácter excepto un carácter de espacio en blanco o <)* Cerrar el grupo de no captura y, opcionalmente, repetir const regex = /\bhttps?:\/\/[^\s<]*(?:<(?!br>)[^\s<]*)*/; [ "Webcam-Aufnahme https://www.example.com/file?id=959559110184937375.mp4&code=4yrn1ev<br><b>test<b><br>", "Webcam-Aufnahme https://www.example.com/file?id=959559110184937375.mp4&code=4yrn1ev" ].forEach(s => { const m = s.match(regex); if (m) { console.log(m[0]); } });