2011-04-05 05:57:20 +0000 2011-04-05 05:57:20 +0000
45

Emparejando sólo la primera ocurrencia en una línea con Regex

Soy completamente nuevo en regex y apreciaría enormemente cualquier ayuda.

La tarea es simple. Tengo un archivo CSV con registros que dicen así:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

Me gustaría reemplazar la primera coma con un espacio y dejar el resto de las comas intactas, para cada línea. ¿Hay una expresión regex que sólo coincida con la primera coma?

Probé esto: ^.....,. Esto coincide con la coma, sin embargo, también coincide con toda la longitud de la cadena que precede a la coma, así que si trato de reemplazar esto con un espacio todos los números se borran también.

Respuestas [6]

55
2011-04-05 06:26:54 +0000

El patrón de emparejamiento podría ser:

^([^,]+),

Eso significa

^ starts with
[^,] anything but a comma
+ repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+) remember that part
, followed by a comma

Por ejemplo, en Perl, todo el emparejamiento y el reemplazo se vería como:

s/^([^,]+),/ /

La pieza de reemplazo sólo toma todo lo que emparejó y lo reemplaza con el primer bloque que recordó y agrega un espacio. La coma se "deja caer" porque no está en el primer grupo de captura.

55
7
2012-08-01 21:31:36 +0000
s/,/ /

Esto, por defecto (es decir, sin la opción g), reemplaza sólo el primer partido.

7
3
2011-04-05 06:26:08 +0000

Esto debería coincidir sólo con el primer número y la coma: ^(\d{5}),. Si quieres engullir todo lo demás en la línea, cambia el regex a esto: ^(\d{5}),(.*)$

3
2
2015-05-13 00:44:34 +0000

Una solución más elegante es usar el emparejamiento perezoso:

s/^(.+?),/ /

que agrupará los caracteres moviéndose desde el principio de la cadena (^) hacia el final por un carácter (.+?) en cada paso hasta encontrar el primer signo de coma. Todo este grupo junto con la primera coma ocurrida será reemplazado por el grupo (``) y el espacio.

2
1
2015-02-28 21:07:59 +0000

TextPad siempre tuvo la capacidad de usar la notación posix, pero hay que cambiar la configuración en un cuadro de diálogo diferente. Para usar la configuración por defecto de TextPad para las expresiones regulares, tienes que "escapar" los paréntesis de apertura y cierre:

Reemplazar el espacio después del código postal de 5 dígitos, al principio de cada línea

^\([0-9]+\)[]

Con tabulación

\t

Como arriba, el ^ significa el comienzo de la línea

( es un "paréntesis escapado" y marca el comienzo de la primera expresión de búsqueda, es decir, los cinco dígitos

[0-9]+ significa uno o más dígitos (no sólo los códigos postales de 5 dígitos)

) es otro "paréntesis escapado" para marcar el final de la primera expresión de búsqueda

[] es sólo un espacio (se podrían dejar los corchetes, pero entonces nadie podría verlo en esta página web : -)

En la expresión de reemplazo

\1 es la primera expresión de búsqueda, la parte entre paréntesis arriba (uno o más dígitos)

\t es un carácter de tabulación

Así que el comando de búsqueda y reemplazo busca uno o más dígitos, seguidos de un espacio. Luego reemplaza todo eso con el mismo grupo de dígitos seguido de un tabulador.

No creo que haya ninguna manera de encontrar simplemente "un espacio que viene después de 5 dígitos" para que puedas reemplazar el espacio sin tocar los dígitos. Tienes que encontrar los 5 dígitos (la primera cadena) seguidos del espacio (la segunda cadena). Luego, aunque parezca redundante o engorroso, SUSTITUYE la cadena original de 5 dígitos por SÍ MISMO, seguido por el tabulador (la segunda cadena).

Todo el que sabe esto se olvida de que los novatos no tienen ni idea de esto. Por eso te lo deletreo, amigo mío.

Ed Poor Tutor de Matemáticas y Programador de Computadoras retirado de la ciudad de Nueva York

1
0
2019-11-26 19:24:16 +0000

Para que coincida sólo con la primera aparición de cualquier expresión de regex, quita todas las banderas. Cada expresión regex viene con las siguientes banderas posibles y típicamente se usa por defecto la bandera global que coincidirá con más de una ocurrencia:

  • /g = Con esta bandera la búsqueda busca todas las coincidencias, sin ella - sólo se devuelve la primera coincidencia
  • /i = insensible a mayúsculas y minúsculas
  • /m = modo multilínea
  • /s = todo . para coincidir con el carácter de nueva línea \n
  • /u = unicode
  • /y = modo pegajoso (búsqueda en un lugar específico)
0