Pensé que esta expresión regular coincidiría con líneas con [ , pero no si tiene ] :
^.*\[.*(?!\]).*$ En cambio, hace coincidir cada línea con un [ (mostrado en negrita ):
Esto [debe coincidir]. Esta línea debe coincidir
Esta línea no debería coincidir.
Esta línea no debería coincidir. Esta línea [no debe coincidir.
¿Cómo arreglar esa expresión regular para que no coincida con las líneas que tienen un ] ?
Esto [debe coincidir]. Esta línea debe coincidir
Esta línea no debería coincidir.
Esta línea no debería coincidir. Esta línea [no debe coincidir.
Demostración: https://regexr.com/67qk7
Este patrón ^.*\[.*(?!\]).*$ coincide con [ y el siguiente .* coincidirá con el resto de la línea.
Luego, al final de la línea, afirmará no ] directamente a la derecha, lo cual es cierto porque ya está al final de la línea. Entonces el .* es opcional y puede afirmar el final de la cadena.
Por lo tanto, coincidirá con cualquier línea completa que tenga al menos un solo [
Si desea hacer coincidir pares de corchetes de apertura hasta cierre [...] y no permitir ningún corchete dentro de él, o corchetes individuales fuera de él y hacer coincidir al menos un solo par, puede repetir 1 o más veces emparejando pares rodeados por caracteres opcionales que no sean corchetes.
^(?:[^\][\n]*\[[^\][\n]*\])+[^\][\n]*$Una solución alternativa que no es súper eficiente pero es un poco más corta:
^(?!.*\[[^\]\n]*$)[^[\n]*\[.+$Explicación:
(?!.*\[[^\]\n]*$) falla la coincidencia si obtenemos un [ sin cierre ] en cualquier lugar[^[\n]*\[ coincide primero con [ en una línea"Esta expresión regular coincidiría con líneas con un [" (uno o más), "pero no si tiene un ]" (uno o más):
^[^\][\n]*\[[^\]\n]*$