Cómo obtener una expresión regular que haga todo esto y devuelva un valor booleano como respuesta.
1: obtiene números separados por cualquier delimitador (espacio o cualquier carácter no numérico), 2: elimina todos los números de esa matriz de menos de 5 dígitos y crea una nueva matriz 3: da un resultado booleano como a si la nueva matriz tiene menos de 4 elementos (eso determina si es válida). 4: Si la cadena de entrada solo tiene caracteres, entonces la prueba de expresiones regulares debería pasar
const goodlist = "111,256 323| 78987 & 65434 727272727"; // should be good
const badlist = "111256333 323666666a| 78987333333 & 6543 727272727";
let numberPattern = /\d+/g;
let numbersArr1 = goodlist.match(numberPattern);
let filArr1 = numbersArr1.filter((w) => w.length > 4);
let numbersArr2 = badlist.match(numberPattern);
let filArr2 = numbersArr2.filter((w) => w.length > 4);
console.log(numbersArr1, numbersArr2);
const isGoodListOK = filArr1.length < 4;
const isBadListOK = filArr2.length < 4;
document.getElementById("app").innerHTML = `
<div>Input string: ${goodlist}</div>
<br/>
<div>Formatted input: ${numbersArr1} : Filtered Array: ${filArr1}</div>
div>is this list ok: ${isGoodListOK}</div>
<br/>
<br/>
<br/>
<br/>
<div>Input string: ${badlist}</div>
<br/>
<div>Formatted input: ${numbersArr2} : Filtered Array: ${filArr2}</div>
<div>is this list ok: ${isBadListOK}</div>
Hice todo esto en javscript, pero me gustaría una sola expresión regular
https://codesandbox.io/s/simple-regex-to-check-date-format-forked-l1c6pl?file=/src/index.js
Puede usar un patrón único que afirme no 4 veces 4 o más dígitos y luego hacer coincidir al menos una sola ocurrencia.
^(?!(?:.*?\b\d{4,}\b){4}).+
Explicación
^ Comienzo de cadena(?! Anticipación negativa
(?: grupo de no captura.*? Coincidir con cualquier personaje, la menor cantidad posible\b\d{4,}\b Luego haga coincidir 4 o más dígitos entre los límites de las words){4} Cierre el grupo de no captura y repítalo 4 veces) Cerrar la búsqueda anticipada.+ Haga coincidir hasta la primera aparición de 4 dígitos entre los límites de las words, o haga coincidir toda la línea que consta solo de espacios o caracteres A-Za-zDemostración de expresiones regulares
const goodlist = "111,256 323| 78987 & 65434 727272727"; // should be good
const badlist = "111256333 323666666a| 78987333333 & 6543 727272727";
const goodlist2 = 'Harry Potter'
const goodlist3 = '123 | 111 | 233 | 534'
const regex = /^(?!(?:.*?\b\d{4,}\b){4}).+/;
console.log(regex.test(goodlist));
console.log(regex.test(badlist));
console.log(regex.test(goodlist2));
console.log(regex.test(goodlist3));