Pregunta

Permítanme comenzar con esto diciendo que soy un completo aficionado cuando se trata de RegEx y solo comencé hace unos días. Estoy tratando de resolver un problema al formatear un archivo y he golpeado un problema con un tipo particular de datos. El archivo de entrada está estructurado de esta manera:

Two words,Word,Word,Word,"Number, number"

Lo que necesito hacer es formatearlo así ...

"Two words","Word",Word","Word","Number, number"

He tenido un patrón RegEx de

s/,/","/g

funciona, excepto que también reemplaza la coma en la sección Número, número ya citado, lo que hace que el campo se separe y rompa el archivo. Esencialmente, necesito modificar mi patrón para reemplazar una coma con ", " [cita comas], pero solo cuando esa coma no es seguida por un espacio. Tenga en cuenta que los otros campos nunca tendrán un espacio detrás de la coma, solo la lista de números delimitados.

Me las arreglé para escribir

s/,[A-Za-z0-9]/","/g

que, al mismo tiempo que coincide con las cadenas apropiadas, reemplazaría la coma Y la siguiente letra. He oído hablar de referencias y creo que podría ser lo que necesito usar. Mi entendimiento fue que

s/(,)[A-Za-z0-9]\b

debería funcionar, pero no funciona.

¿Alguien tiene una idea?

¿Fue útil?

Solución

s /, ([^]) / ", " $ 1 / coincidirá con un " , " seguido de un " not-a-space " ;, captura el not-a-space, luego reemplaza todo con la parte capturada.

Dependiendo de qué motor de expresiones regulares esté utilizando, puede estar escribiendo \ 1 u otras cosas en lugar de $ 1 .

Si estás usando Perl o tienes acceso a un motor de expresiones regulares con lookahead negativo, s /, (?!) / ", " / (a " , " no seguido de un espacio) funciona.

Sin embargo, su entrada se parece a CSV, y si lo fuera, sería mejor analizarla con un analizador CSV real en lugar de con expresiones regulares. Hay muchos otros casos curiosos en las esquinas de los que preocuparse.

Otros consejos

Mi experiencia ha sido que esto no es un gran uso de expresiones regulares. Como ya se dijo, los archivos CSV se manejan mejor con analizadores CSV reales. No etiquetaste un idioma, por lo que es difícil saberlo, pero en perl, uso Text :: CSV_XS o DBD :: CSV (permitiéndome que SQL acceda a un archivo CSV como si fuera una tabla, que, por supuesto, utiliza Text :: CSV_XS debajo de las portadas). Mucho más simple que rodar la mía, y mucho más robusto que usar expresiones regulares.

Esta pregunta es similar a: Reemplazar patrones que están dentro de delimitadores usando una llamada de expresión regular .

Esto podría funcionar:

s/"([^"]*)"|([^",]+)/"$1$2"/g

Parece que estás usando Sed.

Si bien tu patrón parece ser un poco inconsistente, asumo que te gustaría que cada elemento separado por comas tenga citas a su alrededor. De lo contrario, está buscando áreas de complejidad computacional que las expresiones regulares no deben manejar.

A través de sed, tu comando sería:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

Tenga en cuenta que todavía tendrá que poner comillas dobles al principio y al final de la cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top