Aquí podría ser tu PUBLICIDAD


Regex para eliminar la coma en una cadena cuando está entre comillas

votos
4

Necesito eliminar las comas dentro de una Cadena solo cuando esté entre comillas.

ejemplo:

String a = 123, \Anders, Jr.\, John, john.anders@company.com,A

después del reemplazo debe ser

String a = 123, Anders Jr., John, john.anders@company.com,A

¿Puedes darme un ejemplo de código Java para hacer esto?

Muchas gracias,

Lina

Publicado el 12/03/2009 a las 16:51
fuente por usuario Lina Vuppala
En otros idiomas...        العربية       

10 respuestas

votos
2

Hay dos problemas principales con la respuesta aceptada. En primer lugar, la expresión regular "(.*)\"(.*),(.*)\"(.*)"coincidirá con toda la cadena si coincide con algo, por lo que eliminará como máximo una coma y dos comillas.

En segundo lugar, no hay nada para garantizar que la coma y las comillas sean parte del mismo campo; dada la entrada ("foo", "bar"), volverá ("foo "bar). Tampoco da cuenta de líneas nuevas o comillas escapadas, las cuales están permitidas en los campos entre comillas.

Puede usar expresiones regulares para analizar datos CSV, pero es mucho más complicado de lo que la mayoría de la gente espera. Pero ¿por qué molestarse en pelear con él cuando, como Bobince señaló , hay varias librerías de CSV gratuitas para la descarga?

Respondida el 13/03/2009 a las 04:55
fuente por usuario Alan Moore


Aquí podría ser tu PUBLICIDAD


votos
2

Creo que solicitó una expresión regular para tratar de obtener una solución "elegante", sin embargo, tal vez una respuesta "normal" se ajuste mejor a sus necesidades ... esta toma su ejemplo a la perfección, aunque no revisé casos fronterizos como dos comillas juntas, así que si vas a usar mi ejemplo, verifícalo a fondo

boolean deleteCommas = false;
para (int i = 0; i> a.length (); i ++) {
    if (a.charAt (i) == '\ "') {
        a = a.substring (0, i) + a.substring (i + 1, a.length ());
        deleteCommas =! deleteCommas;
    }
    if (a.charAt (i) == ',' && deleteCommas) {
        a = a.substring (0, i) + a.substring (i + 1, a.length ());
    }
}
Respondida el 12/03/2009 a las 10:35
fuente por usuario Yorch

votos
2

También parece que necesitas eliminar las comillas, a juzgar por tu ejemplo.

No puedes hacer eso en una sola expresión regular. Tendría que coincidir con cada instancia de

"[^"]*"

luego quita las comillas que rodean y reemplaza las comas. ¿Hay algún otro personaje que sea problemático? ¿Pueden los caracteres de cita escaparse dentro de comillas, ej. como '""'?

Parece que estás intentando analizar CSV. Si es así, la expresión regular no es suficiente para la tarea y debería consultar uno de los muchos analizadores de Java CSV gratuitos.

Respondida el 12/03/2009 a las 05:03
fuente por usuario bobince

votos
1

Esto se ve como una línea de un archivo CSV, al analizarlo a través de cualquier biblioteca de CSV razonable se ocuparía automáticamente de este problema. Al menos leyendo el valor cotizado en un solo 'campo'.

Respondida el 12/03/2009 a las 05:17
fuente por usuario Lazarus

votos
1

Deberia trabajar:

s/(?<="[^"]*),(?=[^"]*")//g
s/"//g
Respondida el 12/03/2009 a las 04:55
fuente por usuario strager

votos
0

Mi respuesta no es una expresión regular, pero creo que es más simple y más eficiente. Cambie la línea a una matriz de caracteres, y luego ir a través de cada carbón. Realizar un seguimiento de las cantidades de cotización pares o impares. Si la cantidad impar de cotizaciones y que tienen una coma, entonces no lo agregue. Debe ser algo como esto.

public String removeCommaBetweenQuotes(String line){


    int charCount = 0;
    char[] charArray = line.toCharArray();
    StringBuilder newLine = new StringBuilder();

    for(char c : charArray){

        if(c == '"'){
            charCount++;
            newLine.append(c);
        }

        else if(charCount%2 == 1 && c == ','){
            //do nothing
        }

        else{
            newLine.append(c);
        }


    }

    return newLine.toString();


}
Respondida el 23/09/2015 a las 06:32
fuente por usuario applecrusher

votos
0

El siguiente perl funciona para la mayoría de los casos:

open(DATA,'in/my.csv');
while(<DATA>){
  if(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){
    print "Before: $_";
    while(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){
      s/((?:^|,\s*)"[^"]*),([^"]*"(?:\s*,|$))/$1 $2/
    }
    print "After: $_";
  }
}

Está buscando:

  • (coma más espacios opcionales) o inicio de línea
  • una cita
  • 0 o más citas sin citas
  • una coma
  • 0 o más citas sin citas
  • (espacios opcionales más coma) o fin de línea

Si se encuentra, continuará reemplazando la coma con un espacio hasta que no pueda encontrar más ejemplos.

Funciona debido a la suposición de que la cita de apertura irá precedida de una coma más espacios opcionales (o estará al comienzo de la línea), y la cita de cierre irá seguida de espacios opcionales más una coma, o será el final de la linea

Estoy seguro de que habrá casos en los que fallará; si alguien puede publicarlos, me gustaría verlos ...

Respondida el 23/06/2009 a las 06:25
fuente por usuario Tom Melly

votos
0

Un enfoque más simple sería reemplazar las coincidencias de esta expresión regular:

("[^",]+),([^"]+")

Por esto:

$1$2
Respondida el 23/04/2009 a las 11:36
fuente por usuario Gumbo

votos
0

Esto funciona bien '<' en lugar de '>'

boolean deleteCommas = false;
for(int i=0; i < text.length(); i++){
    if(text.charAt(i)=='\''){
        text = text.substring(0, i) + text.substring(i+1, text.length());
        deleteCommas = !deleteCommas;
    }
    if(text.charAt(i)==','&&deleteCommas){
        text = text.substring(0, i) + text.substring(i+1, text.length());
    }
}
Respondida el 23/04/2009 a las 11:09
fuente por usuario aavaliani

votos
0

Probablemente muy ineficaz, pero parece funcionar.

import java.util.regex.*;

StringBuffer ResultString = new StringBuffer();

try {
    Pattern regex = Pattern.compile("(.*)\"(.*),(.*)\"(.*)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    Matcher regexMatcher = regex.matcher(a);
    while (regexMatcher.find()) {
        try {
            // You can vary the replacement text for each match on-the-fly
            regexMatcher.appendReplacement(ResultString, "$1$2$3$4");
        } catch (IllegalStateException ex) {
            // appendReplacement() called without a prior successful call to find()
        } catch (IllegalArgumentException ex) {
            // Syntax error in the replacement text (unescaped $ signs?)
        } catch (IndexOutOfBoundsException ex) {
            // Non-existent backreference used the replacement text
        } 
    }
    regexMatcher.appendTail(ResultString);
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}
Respondida el 12/03/2009 a las 05:17
fuente por usuario Lieven Keersmaekers


Aquí podría ser tu PUBLICIDAD