Grep: busque entre "comienzo de un párrafo" y dos puntos:

Trato de aplicar un estilo a una cadena de palabras que comienza un párrafo y antes de dos puntos.

Preparé una primera búsqueda Grep pero no funciona (solo coloca el cursor antes de los dos puntos sin seleccionar nada...

(?=^)*?(?=\:)

¿Alguna idea?

Respuestas (1)

Al principio tienes (?=^). Una búsqueda anticipada positiva que mira hacia adelante para ver si un comienzo de párrafo viene después del texto que tiene antes de la búsqueda anticipada (en este caso, ninguno). Luego tienes *?las búsquedas de Cero o Más Tiempos (Correspondencia Más Corta) de ese Positivo Lookahead . Está un poco deformado. En realidad, no seleccionas ningún personaje.

Para su enfoque de trabajo, tendría que usar una Mirada atrás positiva (?<=^) que mira hacia atrás para ver si un Principio de párrafo viene antes del texto sin seleccionarlo. Luego use .*?para seleccionar cualquier carácter Cero o más veces (coincidencia más corta) y una búsqueda anticipada positiva (?=:) para finalizar la selección antes de dos puntos:

(?<=^).*?(?=:)

Pero puedes escribirlo más simple. ^siempre no coincide, por lo que no necesita mirar atrás:

^.*?(?=:)

^en sí mismo no coincide, por lo que no es necesario mirar atrás en absoluto; de hecho, no hubiera pensado que mirar atrás para a ^funcionaría en absoluto. Sin embargo, su versión también coincidirá con cadenas no iniciales (es decir, si hay dos puntos, coincidirá con la cadena entre ellos), por lo que ^se necesita una. *?es perfectamente válido: es una coincidencia de comodines no codiciosos. Incluso podría usar esto para simplificar un poco la consulta: ^.*?:coincidirá con lo mismo que ^[^:]*:(incluidos los dos puntos) y ^.*?(?=:)coincidirá con lo mismo que su ^[^:]*(?=:)(con el extra ^).
Supongo que la razón por la que la consulta original simplemente coloca el cursor antes de los dos puntos es que, (?=^)por definición, no puede coincidir con nada, pero aparentemente no es inválida sintácticamente, por lo que es equivalente a un grupo vacío que no coincide. Este grupo vacío (= cualquier cosa que no sea una coincidencia que no esté vacía, es decir, cualquier posición entre caracteres) se empareja de manera no codiciosa hasta una posición en la que es seguido por dos puntos (de la búsqueda hacia adelante), es decir, la posición entre el dos puntos y el carácter inmediatamente anterior. ¡Sin embargo, definitivamente no es un uso normal de GREP!
@JanusBahsJacquet, usar el comodín no codicioso *?es bueno, pero no entiendo por qué sientes la necesidad de tenerlo ^al principio. A mí me parece que .*?(?=:)funciona tan bien como ^.*?(?=:). Vea aquí y observe cómo no selecciona la cadena entre los dos puntos. ¿Me estoy perdiendo de algo?
@JanusBahsJacquet, y por favor, si digo algo incorrecto sobre GREP en mi respuesta, ¡no dude en corregirlo!
Eso está en un estilo GREP , que solo coincide una vez por párrafo. La pregunta menciona una búsqueda GREP , que coincidirá varias veces por párrafo (a menos que la consulta contenga una marca de párrafo o $, por supuesto). Si realiza una búsqueda/reemplazo de todo con la misma consulta, también debería coincidir con la cadena entre los dos puntos.
@JanusBahsJacquet, ¡Vaya! Entiendo. Mi respuesta es un desastre entonces.
@JanusBahsJacquet, edité. ¿Es correcto ahora?
¡Me parece bien!