Tengo el siguiente código para hacer una validación de IP básica. En realidad, es solo académico y estoy usando este código para practicar el uso de String.replace (intencionalmente usando una expresión regular pobre/suelta):
let potential_ips = [ '1.2.3.4.5', '12.34.45.56', '123.456.789.0', '1.2.3.4.5.6' ] var group_num = 0; function rePlace(m, g1) { group_num ++; if (parseInt(g1) > 255) { return '<invalid>' } else if (group_num > 4) { return '<invalid>' } else { return m; } } const regex = /(\d{1,3})\.?/g; for (ip of potential_ips) { group_num = 0; ip = ip.replace(regex, rePlace); console.log('222', ip); } Lo que estoy tratando de hacer es cuando se llama a la función .replace para mantener un total acumulado de la cantidad de veces que se ha llamado para esa cadena en particular. Actualmente estoy usando una var en el alcance de nivel superior, pero me pregunto si hay una forma más limpia de hacer esto dentro de la función en sí. ¿Cuál sería un mejor enfoque para hacer esto?
Podría tomar un cierre sobre el conteo e inicializar con cero.
const rePlace = count => m => { count++; if (parseInt(m) > 255 || count > 4) return '<invalid>'; return m; }, regex = /\d+(?=(\.|$))/g, potential_ips = ['1.2.3.4.5', '12.34.45.56', '123.456.789.0', '1.2.3.4.5.6']; for (let ip of potential_ips) { ip = ip.replace(regex, rePlace(0)); console.log('222', ip); }El concepto aquí se copia de la respuesta de Nina, pero aquí hay un enfoque en el que la función rePlace ahora devuelve una función vinculada con una variable inicializada a cero (¿quizás un poco como los números de la Iglesia?)
function rePlace(count) { return function(m) { count ++; return (parseInt(m) > 255 || count > 4) ? '<invalid>' : m; } } const regex = /\d+(?=(\.|$))/g const potential_ips = ['1.2.3.4.5', '12.34.45.56', '123.456.789.0', '1.2.3.4.5.6'] ; for (let ip of potential_ips) { ip = ip.replace(regex, rePlace(0)); console.log('222', ip); }