Necesito analizar los tokens de una cadena de formato GS1 UDI:
"(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888" Me gustaría dividir esa cadena con una expresión regular en "(nnn)" y tener el delimitador incluido con los valores divididos, así:
[ "(20)987111", "(240)A", "(10)ABC123", "(17)2022-04-01", "(21)888888888888888" ]A continuación se muestra un JSFiddle con ejemplos, pero en caso de que quieras verlo aquí mismo:
// This includes the delimiter match in the results, but I want the delimiter included WITH the value // after it, eg: ["(20)987111", ...] str = "(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888"; console.log(str.split(/(\(\d{2,}\))/).filter(Boolean)) // Result: ["(20)", "987111", "(240)", "A", "(10)", "ABC123", "(17)", "2022-04-01", "(21)", "888888888888888"] // If I include a pattern that should (I think) match the content following the delimiter I will // only get a single result that is the full string: str = "(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888"; console.log(str.split(/(\(\d{2,}\)\W+)/).filter(Boolean)) // Result: ["(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888"] // I think this is because I'm effectively mathching the entire string, hence a single result. // So now I'll try to match only up to the start of the next "(": str = "(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888"; console.log(str.split(/(\(\d{2,}\)(^\())/).filter(Boolean)) // Result: ["(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888"]Encontré y leí esta pregunta , sin embargo, los ejemplos allí son literales coincidentes y estoy usando clases de caracteres y obteniendo resultados diferentes.
No puedo crear un patrón de expresiones regulares que proporcione lo que busco. Aquí hay un JSFiddle de algunas de las cosas que probé: https://jsfiddle.net/6bogpqLy/
No puedo garantizar el orden de los "identificadores de aplicación" en la cadena de entrada y, como tal, la coincidencia con capturas nombradas no es una opción atractiva.
Puede dividir en posiciones donde sigue el elemento entre paréntesis, utilizando una aserción anticipada de longitud cero:
const text = "(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888" const parts = text.split(/(?=\(\d+\))/) console.log(parts)En lugar de split , use la match para crear la matriz. Luego busque 1) dígitos entre paréntesis, seguidos de un grupo que pueda contener un dígito, una letra o un guión, y luego 2) agrupe toda la consulta.
(PD. A menudo encuentro que un sitio como Regex101 realmente ayuda cuando se trata de probar expresiones fuera de un entorno de desarrollo).
const re = /(\(\d+\)[\d\-AZ]+)/g; const str = '(20)987111(240)A(10)ABC123(17)2022-04-01(21)888888888888888'; console.log(str.match(re));