2009-09-08 18 views
52

delimitado ¿Cuál es la expresión regular para validar una lista separada por comas, como éste:expresión regular para comas lista

12365, 45236, 458, 1, 99996332, ...... 
+0

personajes nunca lo habrá escapado, como: '12365,45236, "Este es un \" prueba ". ' – ceejayoz

+6

¿Por qué tiene que ser una expresión regular? Dependiendo del idioma, es mejor que utilices un analizador de CSV incorporado. –

Respuesta

86

sugiero que hagas de la siguiente manera:

(\d+)(,\s*\d+)* 

que trabajaría para una lista que contiene 1 o más elementos.

+1

tienes razón, tuve que pelar un primer personaje antes de que pudiera usar la expresión regular, gracias a todos por ayudar – everLearningStudent

+0

esto parece estar funcionando solo hasta la primera coma ... – ondrobaco

+0

@ondrobaco: Probablemente solo estás inspeccionando el primer grupo de partidos. El siguiente grupo de partidos contendrá el resto de la lista. – Asaph

6

Partido duplicar los elementos delimitados por comas:

(?<=,|^)([^,]*)(,\1)+(?=,|$) 

Reference.

Esta expresión regular se puede utilizar para dividir los valores de una lista delimitada por comas. Los elementos de la lista pueden ser citados, sin comillas o vacíos. Las comas dentro de un par de comillas no coinciden.

,(?!(?<=(?:^|,)\s*"(?:[^"]|""|\\")*,)(?:[^"]|""|\\")*"\s*(?:,|$)) 

Reference.

+0

¿Qué hace allí exactamente el símbolo de la tubería (|)? Es el símbolo que no se explica en el página a la que se vincula, y no puedo encontrarle sentido. –

+0

@ThomasVanderStichele: Es por alternancia. '(foo | bar)' coincide con 'foo' o' bar'. Para más información: http: // www. regular-expressions.info/alternation.html –

1

Es posible que desee especificar el idioma sólo para estar seguro, pero

(\d+, ?)+(\d+)? 

debe trabajar

+1

Esta solución falla para una lista que contiene solo 1 elemento. Vea mi solución a continuación. – Asaph

6

Depende un poco de sus necesidades exactas. Estoy asumiendo que: todos los números, cualquier longitud, los números no pueden tener ceros a la izquierda ni contienen comas o puntos decimales. los números individuales siempre separados por una coma y luego un espacio, y el último número NO tiene una coma y espacio después. Cualquiera de estos errores simplificaría la solución.

([1-9][0-9]*,[ ])*[1-9][0-9]*

Así es como he construido que mentalmente:

[0-9] any digit. 
[1-9][0-9]* leading non-zero digit followed by any number of digits 
[1-9][0-9]*, as above, followed by a comma 
[1-9][0-9]*[ ] as above, followed by a space 
([1-9][0-9]*[ ])* as above, repeated 0 or more times 
([1-9][0-9]*[ ])*[1-9][0-9]* as above, with a final number that doesn't have a comma. 
+0

gracias por el rápido tutorial – everLearningStudent

+0

Encontré esta respuesta realmente útil, solo necesitaba un pequeño ajuste para aceptar espacios en blanco antes y después de la coma '([1-9] [0-9] * [] *, [] *) * [1-9] [0-9] * '... tal vez alguien encuentre este útil – pollirrata

+0

Me gusta este ejemplo, ¿cómo permitiré los saltos de línea después de esto? – justinpees

2

utilicé esto para una lista de elementos que tenían que ser alfanuméricos sin guiones bajos en la parte frontal de cada elemento.

^(([0-9a-zA-Z][0-9a-zA-Z_]*)([,][0-9a-zA-Z][0-9a-zA-Z_]*)*)$ 
1

tuve un requisito ligeramente diferente, para analizar un diccionario/tabla hash codificado por comas escapado, así:

"1=This is something, 2=This is something,,with an escaped comma, 3=This is something else" 

Creo que esta es una solución elegante, con un truco que evita muchos de la complejidad de expresiones regulares:

if (string.IsNullOrEmpty(encodedValues)) 
{ 
    return null; 
} 
else 
{ 
    var retVal = new Dictionary<int, string>(); 
    var reFields = new Regex(@"([0-9]+)\=(([A-Za-z0-9\s]|(,,))+),"); 
    foreach (Match match in reFields.Matches(encodedValues + ",")) 
    { 
     var id = match.Groups[1].Value; 
     var value = match.Groups[2].Value; 
     retVal[int.Parse(id)] = value.Replace(",,", ","); 
    } 
    return retVal; 
} 

Creo que se puede adaptar a la pregunta original con una expresión como @"([0-9]+),\s?" y analizar en Groups[0].

Espero que sea útil para alguien y gracias por los consejos para conseguirlo cerca de allí, ¡especialmente Asaph!

1

Éste rechazará comas extrañas al principio o al final de la línea, si eso es importante para usted.

((,)?(^)?(possible|value|patterns))* 

Reemplazar possible|value|patterns con una expresión regular que coincide con sus valores permitidos.

5

Esta expresión regular extrae un elemento de una lista separada por comas, independientemente de su contenido:

(.+?)(?:,|$) 

Si acaba de cambiar la coma con algo más, que debería funcionar para cualquier delimitador.

+0

¿Extrae más de un elemento? – paranza

+0

¡Gracias muy útil! – mt81

+0

¡Esto es genial! ¡Gracias! – dabito

0

En JavaScript, utilice split para ayudar, y al quemar cualquier dígito negativos, así:

'-1,2,-3'.match(/(-?\d+)(,\s*-?\d+)*/)[0].split(','); 
// ["-1", "2", "-3"] 
// may need trimming if digits are space-separated 
Cuestiones relacionadas