Estoy usando expresiones regulares para obtener los índices de las variables que acceden al patrón representado como una cadena, por ejemplo:
string = "test[2][56].var1[4]"El resultado de la coincidencia de expresiones regulares en los grupos 2, 56, 4 capturados.
matchGroups = ["2", "56", "4"]La expresión regular a continuación funciona.
\[([^\.\]]+)\]
Pero no puedo permitir casos como:
"test.[3].var1" o "test[3]/"
Traté de limitar los caracteres permitidos antes y después de cada grupo usando la expresión regular a continuación:
[\]a-zA-Z0-9]\[([^\.\]]+)\]([\[a-zA-Z0-9])?
Pero algunos casos dejaron de funcionar como el caso "test[0].var7[3][4]" (4 no se captura).
Necesito ayuda para que esto funcione con todos los casos nuevamente (los casos se encuentran en el enlace a continuación).
replace la cadena, luego haría la coincidencia
/.*?\[(\d+)\].*?/ Reemplace la cadena donde cualquier número entre paréntesis se reemplaza por un número seguido de ,
/\d+(?=,)/ Mire hacia adelante positivo ; que Encuentra cualquier número seguido de ,
const captureNumber = str => str.replace(/.*?\[(\d+)\].*?/g, "$1,").match(/\d+(?=,)/g) console.log(captureNumber("test[0].var7[3][4]")); //[ "0", "3", "4" ] console.log(captureNumber("test[3]/")); //[ "3" ] console.log(captureNumber("test.[3].var1")); //[ "3" ] console.log(captureNumber("test[2][56].var1[4]")); //[ "2", "56", "4" ]lo más simple sería usar una expresión regular usando una mirada positiva hacia atrás y una mirada hacia adelante positiva. A esto, puede agregar seguridad en los espacios en caso de que tenga un caso como "test[ 2 ][ 56 ].var1[ 4 ]", al que se debe aplicar una cadena de método .trim(). Aquí hay un fragmento que ilustra esto:
const getIndex = str => str.match(/(?<=\[) *\d+ *(?=\])/g).map(val => val.trim()); console.log(getIndex("test[0].var7[3][4]")); //[ "0", "3", "4" ] console.log(getIndex("test[3]/")); //[ "3" ] console.log(getIndex("test.[3].var1")); //[ "3" ] console.log(getIndex("test[2 ][ 56 ].var1[4 ]")); //[ "2", "56", "4" ]Buena suerte !