La búsqueda GREP de Indesign incluye demasiado

Me está volviendo loco y no tengo idea de lo que estoy haciendo mal. En mi documento, tengo que autoformatear algunas expresiones regulares e incluir los corchetes.

Un ejemplo está aquí;

[DP, 07.04.1911, „Protestanten“]

DP también podría ser BSZ, la fecha varía y la cadena entre comillas también.

Intenté seguir la expresión grep:

\[(DP|BSZ)(.*)\]

Esto funciona en todos los casos en los que solo hay una secuencia de este tipo en el párrafo. Si hay un segundo, comienza en el paréntesis de apertura de la primera secuencia y se detiene después del paréntesis de cierre de la segunda y también se selecciona todo lo que se encuentra entre esas secuencias.

¿Qué estoy haciendo mal? Intenté usar las comillas de cierre como punto final, pero da el mismo resultado. Aquí está la expresión grep:

\[(DP|BSZ)(.*)(“*?)\]

El comentario rápido .*es codicioso. Así que también coincidirá con lo que viene después de ellos si hay una segunda instancia de lo que viene después en alguna parte del texto. prueba .*?en su lugar

Respuestas (1)

De forma predeterminada, GREP es codicioso : siempre que se encuentre una coincidencia más adelante, se apoderará de la mayor cantidad posible. Dado .que no coincide (de forma predeterminada) con un carácter de retorno forzoso, normalmente escaneará todo el camino hasta el final de un párrafo. Si habilita el 'modo de una sola línea' usando (?s), entonces el .comodín incluso coincidirá con los retornos duros y, por lo tanto, intentará seleccionar todo el camino hasta el final de su texto.

Hay dos posibles trucos para contrarrestar esto. En primer lugar, no se usa el simple "coincidir con cualquier cosa", .sino una negación del carácter final:

\[(DP|BSZ)[^]]*\]

Esto seleccionará cualquier ejecución de "no ]caracteres" y, por lo tanto, se detendrá en la primera aparición de ], después de lo cual coincidirá con el siguiente carácter, que siempre será el siguiente ].

Sin embargo, una forma más habitual es indicar a GREP que utilice la coincidencia más corta posible, en lugar de la más larga posible predeterminada. Eso se hace agregando el modificador adicional ?después de uno de los códigos de "repetición " ?, o . En tu caso, esto sería+*{x,y}

\[(DP|BSZ)(.*?)\]

Tenga en cuenta que para formatear el texto entre corchetes, no es necesario el conjunto de paréntesis redondos más a la derecha. Simplemente puede usar

\[(DP|BSZ).*?\]

porque los modificadores de cantidad solo actúan en el grupo inmediatamente anterior ( (a|b)), clase de carácter ( [abc]) o (en este caso) carácter único o código de carácter único.

¡Funciona de maravilla! Muchas gracias...