¿La regla grep de InDesign que se aplica a todo y luego se detiene si alcanza un cierto carácter?

Las reglas GREP de InDesign pueden volverse un poco alucinantes. Suponga que desea un estilo de párrafo con una regla de estilo GREP que aplique un estilo de carácter a todo excepto al texto después de cierto carácter. ¿Algo que no se aplica a los caracteres posteriores a cierto carácter, pero se aplica a todo lo demás?

Por ejemplo, imagina una larga lista de títulos de artículos. Algunos son títulos breves, otros son dos partes con un título breve, luego dos puntos y luego una elaboración. Desea que se enfatice la totalidad de los títulos cortos, y que se enfatice todo hasta los dos puntos inclusive en los largos:

  • Víboras de Angola
  • Tejones brillantes: las bestias más musculosas de Gran Bretaña
  • Locuras de caravanas de la carpa canadiense costera
  • Peligro: los cobardes patos de Dinamarca

He probado un montón de reglas, pero ninguna parece funcionar para esto. Pensé que podría ser posible usar una 'mirada atrás negativa', como (?<!:.*).o algo así, pero nada de eso parece funcionar: parece que 'mirar atrás' y 'mirar adelante' solo se pueden aplicar al personaje inmediatamente antes del personaje que estás mirando por.

¿Algún experto en GREP tiene alguna idea?


Aquí hay una cosa que descubrí después de mucha navegación y prueba y error, que creo que lógicamente debería funcionar, pero no funciona, por razones que no puedo entender:

\<[^:]*|\<[^:]*:

En teoría, eso debería significar "Tomar todo, desde el inicio del párrafo hasta el final de la primera serie de caracteres que no son ':', o, si hay una serie de caracteres que no son ':' desde el principio del párrafo hasta un ':', toma eso incluyendo el ':'".

En la práctica, se aplica a todo. No puedo entender por qué.

Respuestas (6)

No tengo InDesign para verificar esto, pero suponiendo que se comporte igual que el probador aquí , creo que debería funcionar:

^.*?(:|$)

Eso es simplemente hacer coincidir todo, desde el comienzo de una cadena hasta los primeros dos puntos o el final de la cadena.

¡Funciona perfectamente! No se me ocurrió que podrías usar la barra 'o' dentro de los corchetes de subexpresión de esa manera. Estoy tratando de entender el papel del signo de interrogación: ¿es para que elija la que sea más corta de las posibles coincidencias?
¡Excelente! El signo de interrogación es exactamente eso. Hace que la *repetición sea "no codiciosa" o "perezosa" ( ver aquí ), por lo que encuentra la coincidencia con la menor cantidad de repeticiones en lugar de la mayor.
Sin embargo, seguramente esto no coincidiría con los dos puntos, como se especifica en la pregunta.

Corto y sencillo:

^[^:]+:?

que significa "todo desde el principio que no sea dos puntos, opcionalmente seguido de dos puntos".

"Todo desde el principio" -- el ^-- debe especificarse porque, de lo contrario, el estilo GREP se aplicará desde el comienzo de un párrafo hasta los primeros dos puntos, y luego nuevamente desde esos dos puntos hasta los dos puntos siguientes ; y luego una y otra vez hasta el final del párrafo. Lo que se reduce a "en realidad todo el párrafo, de principio a fin".
Cada expresión GREP se aplica tantas veces como sea posible dentro de cada párrafo (bastante lógico; si no, la expresión predeterminada \d+solo coincidiría con el primer conjunto de dígitos en cada párrafo).

".. eso no son dos puntos .." -- [^:]+coincide con todos los caracteres excepto con los dos puntos. Si no hay dos puntos, coincidirá con todo el párrafo.

"... opcionalmente seguido de dos puntos": la final :?es hacer coincidir los dos puntos cuando la parte anterior terminó justo antes. Es aplicar el mismo formato a los dos puntos que al texto anterior.

No necesita GREP para hacer esto, puede usar estilos anidados.

En estilos de párrafo, vaya a Capitulares y Estilos anidados. Debajo de esta ventana hay un botón para crear un nuevo estilo anidado. Después de agregar uno, vaya al menú desplegable y seleccione el estilo de carácter con el que desea poner en negrita, luego, donde dice 'Palabras', reemplácelo con ':'.

Esto pondrá en negrita todo el texto en una línea hasta:, si no tiene ", entonces todo el párrafo debe estar en negrita.

Hola Joshua, bienvenido al intercambio de pila de diseño gráfico. Tal como está, esta respuesta no es muy descriptiva. ¿Podría dar más detalles sobre cómo lograría los resultados usando estilos anidados?

Esto es lo más cerca que he logrado:

\<[^:]*|[^:]*:

Significa:

  • \<[^:]*- desde el comienzo del párrafo ( \<), tome cosas que no sean dos puntos ( [^:]), y tome cualquier cantidad de ellas ( *)... (esto obtiene líneas que no tienen dos puntos y líneas con dos puntos hasta el primer punto)
  • |o...
  • [^:]*:tome cualquier número de cosas que no sean dos puntos ( [^:]*) que estén seguidas por dos puntos ( :) (esto amplía la selección en las líneas con dos puntos para incluir los dos puntos en sí)

Funciona bien, a menos que haya dos puntos, en cuyo caso se aplica a todo hasta el último punto, no a todo hasta el primero:

  • Simplemente molesto: por qué nunca seré :-D sobre emoticonos

No se detiene en el primer carácter como se pretendía. Sin embargo, se puede usar si no va a haber una segunda aparición del carácter 'detener'.


Extrañamente, \<[^:]*por sí solo, o \<[^:]*|:parece agarrarlo todo. No puedo entender por qué.

Haría trampa (pero lo hago mucho).

Asegúrese de que cada línea termine en dos puntos, incluso los títulos cortos que no tienen subtítulos.

Use su GREP para hacer todo hasta los dos puntos en negrita.

Ejecute una segunda S/R para encontrar todo con "retorno de dos puntos" y convertirlo en "retorno de disco" (que elimina los dos puntos de cualquier línea sin subtítulo).

Esto realmente no funcionaría si quisieras (comprensiblemente) automatizarlo convirtiéndolo en un estilo GREP.

Aquí hay otra respuesta imperfecta. Si solo se trata de hacer que algo se vea diferente, podría hacer lo contrario de lo que pide la pregunta: enfatizar todo, tomar todo después del personaje y aplicar un estilo que lo reste énfasis.

Esto es bastante simple:

:.*

Comienza con lo que sea que sea el primer carácter y luego continúa, por lo que no tiene el problema anterior.

No es una respuesta completa, ya que no funcionará en los casos en que tenga que ser la primera parte que tenga el estilo, pero funcionará en algunos casos.