Foro de elhacker.net

Programación => Java => Mensaje iniciado por: .:UND3R:. en 25 Noviembre 2013, 21:18 pm



Título: [Solucionado]Duda con regex
Publicado por: .:UND3R:. en 25 Noviembre 2013, 21:18 pm
Qué expresión regular debería filtrar una string para que me queden solo números y guiones de la siguiente forma:
00-123-456-789 o 00123456789

pero no esto:
00-123--457-789
-00-123-456-789-
-00123456789-
00-123-456-789-

Solo números y guiones, estos no deberían repetirse ni estar en los extremos

Código
  1.        String regex = ?????????
  2.        String test = "123asd--asd-12312-asd-11-1333-122";
  3.        System.out.println(test.replaceAll(regex, test));

Gracias


Título: Re: Duda con regex
Publicado por: csp en 25 Noviembre 2013, 22:47 pm
La longitud de las cadenas es la misma que pusiste en los ejemplos, en esos formatos? O es solo a modo de explicación?


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 25 Noviembre 2013, 22:52 pm
entre guiones puede ir cualquier cantidad de dígitos, muchas gracias por tu interés


Título: Re: Duda con regex
Publicado por: Shell Root en 25 Noviembre 2013, 23:06 pm
y puede haber n cantidad de guiones?


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 00:00 am
efectivamente, intentaré detallar:
Sólo puede constar de números y guiones (-)
No pueden haber guiones al inicio y al final, ejemplo:
-10101-123123
191919-23123-
-34534-1233-
-123-
etc.

No se pueden repetir guiones:
1234--123

Debe tener n números entre medio de cada guión y n guiones

uff listo jeje


Título: Re: Duda con regex
Publicado por: csp en 26 Noviembre 2013, 00:18 am
Fijate con esta a ver si hace lo que necesitás:

Código
  1. ^[\d]+(\-?\d)*


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 00:41 am
Me marca un error:

Código
  1. String test = "123asd--asd-12312-asd-11-1333-122";
  2.        System.out.println(test.replaceAll("^[\d]+(\-?\d)*", "vv"));

¿ A qué se puede deber esto?

Gracias nuevamente

PD: soy nuevo con esto de expresiones regulares y su uso (es un caso de necesidad puntual)

EDIT: Utilizo netbeans y me marca que la string presenta ilegal scape character


Título: Re: Duda con regex
Publicado por: csp en 26 Noviembre 2013, 00:53 am
La verdad no te sabría responder el porque del error (Recién estoy comenzando a aprender Java), pero intentá de la siguiente manera:

Código
  1. ^[\\d]+(\\-?\\d)*


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 01:04 am
Ahí ha funcionado, aunque no cumple con lo que me gustaría que hiciera, he aquí la entrada y luego la salida:

Entrada:

123asd--asd-12312-asd-11-1333-122

Salida:

asd--asd-12312-asd-11-1333-122

Solo elimino el primer caracter, debería quedar:

123-12312-11-1333-122

A ver que se puede hacer muchas gracias


Título: Re: Duda con regex
Publicado por: Danyfirex en 26 Noviembre 2013, 02:34 am
se me ocurrió algo así:



Código
  1. test.replaceAll("([^\d]+){1,3}", "-")
  2.  

no lo probé.

saludos


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 02:52 am
Wuajajaja funciona de maravilla, muchas gracias  ;-)

Edit: hay un pequeño problema lo que ocurre es que estoy filtrando un jtexfield cuando escribo una letra o lo que sea se convierte en un "-", cómo se arreglaría aquello?

Código
  1. public void insertString(int offset, String  str, AttributeSet attr) throws BadLocationException {
  2.        if (str == null) return;
  3.  
  4.        if ((getLength() + str.length()) <= limit) {
  5.            super.insertString(offset, str.replaceAll("([^\\d]+){1,3}", "-"), attr);
  6.        } else if (getLength() <= limit) {
  7.            super.insertString(offset, str.substring(0, limit-getLength()), attr);
  8.        }
  9.    }


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 03:08 am
Esto funciona cuando hacen un copy paste en el textfield pero no cuando se escribe de forma manual:

Código
  1. public void insertString(int offset, String  str, AttributeSet attr) throws BadLocationException {
  2.        if (str == null) return;
  3.  
  4.        if ((getLength() + str.length()) <= limit) {
  5.            super.insertString(offset, str.replaceAll("([^\\d]+){1,3}", "-"), attr);
  6.        } else if (getLength() <= limit) {
  7.            super.insertString(offset, str.substring(0, limit-getLength()).replaceAll("([^\\d]+){1,3}", "-"), attr);
  8.        }
  9.    }


Título: Re: Duda con regex
Publicado por: Danyfirex en 26 Noviembre 2013, 03:19 am
mmm lo tienes como un callback. (es que no se java)

pues tendrías que colocar mas condiciones. no manejo mucho expresiones regulares eso fue algo básico que recordaba y como dices funciona solo cuando esta todo en el  textfield si vas escribiendo remplazara por "-" menos los números.


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 13:37 pm
De todas formas, muchas gracias, a ver si alguien se anima a solucionar el pequeño desperfecto del regex, saludos :)


Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 21:05 pm
Solucionado, tuve que aprender regex  :(, adjunto el código:

Código
  1. str = str.replaceAll("^\\-|[^0-9\\-]|\\-$", "");
  2.        while(str.contains("--")){
  3.            str = str.replaceAll("\\-\\-", "-");
  4.        }

Saludos