Supongamos que tengo una cadena de esta naturaleza Set 1 (2) Set 2 (2) Set 3 (2) Set 4 (2) [Choose Two] . ¿Cómo puedo hacer una expresión regular que comience después ( es importante que sea después o simplemente puedo agregarla de nuevo ) cada carácter y, opcionalmente, termine en un carácter ] , por lo que dividir la cadena se vería así?
Set 1 (2) Set 2 (2) Set 3 (2) Set 4 (2) [Choose Two] -> [Set 1 (2)], [Set 2 (2)], [Set 3 (2)], [Set 4 (2)] Puede haber algunos caracteres vacíos y espacios en blanco finales en la matriz creada cuando se usan expresiones regulares, pero puedo eliminarlos. Mi intento actual es algo así como /\)(\s+).+(\]?)/gm pero debido a que .+ es codicioso, va hasta el final para cada coincidencia de la siguiente manera:
Set 1 (2) Set 2 (2) Set 3 (2) Set 4 (2) [Choose Two] -> Set 1 (2{) Set 2 (2) Set 3 (2) Set 4 (2) [Choose Two]} -> [Set 1 (2] También incluye el ) cuando se divide, lo cual no es deseable.
Probar:
(?<!\S).*?\) \b.*\)Ver una demostración en línea
(?<!\S) = Negative lookbehind para afirmar la posición no está precedida por un carácter que no sea un espacio en blanco;.*?\) - 0+ (perezosos) caracteres hasta un paréntesis de cierre literal. La diferencia con la alternativa \b.*\) es usar un límite de palabras, pero no estoy seguro de si eso va bien con sus datos reales.
var s = 'Set 1 (2) Set 2 (2) Set 3 (2) Set 4 (2) [Choose Two]'; var m = s.match(/(?<!\S).*?\)/g); console.log(m) const s = "Set 1 (2) Set 2 (2) Set 3 (2) Set 4 (2) [Choose Two]"; const m = s.match(/[^)]+(?:\))/g); console.log(m)Para manejar el espacio en blanco inicial:
const s = "Set 1 (2) Set 2 (2) Set 3 (2) Set 4 (2) [Choose Two]"; const m = s.match(/(?<= |^)[^)]+(?:\))/g); console.log(m)Lo más simple sería usar String.split con esta expresión regular:
/(?<=\))/g Simplemente busca un ) y luego divide el texto en una matriz.
Sin embargo, luego debe eliminar el último elemento de la matriz (que contendrá [Choose Two] ).
Entonces tienes una matriz con cada Set.
Puedes jugar con él aquí .