Eso es debido a la bandera g
. Si invierte las dos llamadas, obtendrá resultados diferentes porque el indicador global establece pattern.lastIndex
y comienza a hacer coincidir ese índice la próxima vez que llame al .test
/.exec
. Cuando la inversión de las llamadas, se obtendría un resultado fuera de null
.exec
y false
para .test
.
Con .lastIndex
y el indicador global, en su caso, coincide con la dirección URL de .test
, y comenzará a buscar más direcciones URL después de la primera URL cuando se ejecuta .exec
. No hay más URL, por lo que obtendrá null
. Tenga en cuenta que lastIndex
se restablece a 0
, así que llamar al .exec
funcionaría nuevamente.
En cualquier caso, parece ser que estás buscando str.match(pattern)
en cambio, que se limita a enumerar todos los partidos:
var str = " test http://example.dom.com/-6/x_5eb0916a.jpg"
+ " \nfoo http://example2.com/test.png";
var pattern = /(http:\/\/\S+\.(?:jpg|gif|png|jpeg|JPG|GIF|PNG|JPEG))/gm;
str.match(pattern);
// ["http://example.dom.com/-6/x_5eb0916a.jpg", "http://example2.com/test.png"]
Tiene un '' demasiado al final de la línea 2. ¿Qué es 'str'? No está definido en tu código. –
Podría ser útil agregar un '\ /' entre su dominio y los patrones de extensión de archivo, para evitar que los subdominios se analicen; de lo contrario 'http: // some.png.example.com/home.html' le dará' http: // // some.png' (concedo que es solo una cuestión de principios;)). – Matmarbon