Dadas las siguientes líneas:
classes!("text-xl", "text-blue-500") String::from("test") classes!("text-sm") ¡Deseo extraer text-xl , text-blue-500 y text-sm y potencialmente cualquier otra cadena dentro de classes!
Lo que tengo hasta ahora es:
(?<=classes!).* - ¡Esto me da todo después de clases! pero no los valores exactos(?!^")".*?" - esto me da los valores que quiero pero con las comillasSi está utilizando Javascript y se admite la búsqueda positiva (no necesita la bandera multilínea, solo la bandera global)
(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")(?<= Positivo mirar atrás para afirmar a la izquierdaclasses!\( ¡Coincidencia de classes!((?:"[^"]*",\s*)* Coincidencia de repeticiones opcionales de "..."," Coincidir con una comilla doble) Cerrar mirar atrás[^"]* Coincide con caracteres opcionales que no sean "(?=") Afirmar " a la derechaDemostración de expresiones regulares
const regex = /(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")/g; const str = `classes!("text-xl", "text-blue-500") String::from("test") classes!("text-sm") `; console.log(str.match(regex))Podrías probar un lookbehind de ancho no fijo así:
(?<=^classes!\("(?:[^"]*"[^"()]*")*)[^"]*Ver una demostración en línea
(?<= - Abre un lookbehind positivo;^classes!\(" - Ancla de línea de inicio y coincidencia literalmente 'classes!("';(?:[^"]*"[^()"]*")* - Un grupo anidado que no captura para hacer coincidir (0+ veces) cualquier carácter que no sea comillas (y paréntesis), una comilla y la misma secuencia repetida .) - Cerrar mirar atrás;[^"]* - Coincide con 0+ (codiciosos) caracteres que no sean comillas.