Estoy buscando una sustitución de expresiones regulares para transformar N espacios en blanco al comienzo de una línea en N . Entonces este texto:
list: - firstdebe convertirse:
list: - firstYo he tratado:
str = "list:\n - first" str.gsub(/(?<=^) */, " ")que devuelve:
list: - first a la que le falta una . ¿Cómo mejorar la sustitución para obtener el resultado deseado?
Puede utilizar el ancla \G y \K para restablecer el punto de inicio de la coincidencia informada.
Para hacer coincidir todos los espacios simples principales:
(?:\R\K|\G)(?: grupo de no captura\R\K Coincidir con una nueva línea y borrar el búfer de coincidencia| O\G Afirmar la posición al final del partido anterior) Cerrar el grupo de no captura y hacer coincidir un espacioVea una demostración de expresiones regulares y una demostración de Ruby .
Para hacer coincidir solo los espacios iniciales individuales en la cadena de ejemplo:
(?:^.*:\R|\G)\KEn partes, el patrón coincide:
(?: grupo de no captura^.*:\R Coincide con una línea que termina con : y coincide con una nueva línea| O\G Afirmar la posición al final de la coincidencia anterior, o al comienzo de la cadena) Cerrar grupo de no captura\K Olvídese de lo que ha coincidido hasta ahora y haga coincidir un espacioVea una demostración de expresiones regulares y una demostración de Ruby .
Ejemplo
re = /(?:^.*:\R|\G)\K / str = 'list: - first' result = str.gsub(re, ' ') puts resultProducción
list: - firstUse gsub con una función de devolución de llamada:
str = "list:\n - first" output = str.gsub(/(?<=^|\n)[ ]+/) {|m| m.gsub(" ", " ") }Esto imprime:
list: - first El patrón (?<=^|\n)[ ]+ captura uno o más espacios al comienzo de una línea. Esta coincidencia luego pasa a la devolución de llamada, que reemplaza cada espacio, uno a la vez, con .