Test Foro de elhacker.net SMF 2.1

Programación => Programación General => 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 (java) [Seleccionar]
       String regex = ?????????
       String test = "123asd--asd-12312-asd-11-1333-122";
       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 (java) [Seleccionar]
^[\d]+(\-?\d)*
Título: Re: Duda con regex
Publicado por: .:UND3R:. en 26 Noviembre 2013, 00:41 AM
Me marca un error:

Código (java) [Seleccionar]
String test = "123asd--asd-12312-asd-11-1333-122";
       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 (java) [Seleccionar]
^[\\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 (java) [Seleccionar]
test.replaceAll("([^\d]+){1,3}", "-")


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 (java) [Seleccionar]
public void insertString(int offset, String  str, AttributeSet attr) throws BadLocationException {
        if (str == null) return;

        if ((getLength() + str.length()) <= limit) {
            super.insertString(offset, str.replaceAll("([^\\d]+){1,3}", "-"), attr);
        } else if (getLength() <= limit) {
            super.insertString(offset, str.substring(0, limit-getLength()), attr);
        }
    }
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 (java) [Seleccionar]
public void insertString(int offset, String  str, AttributeSet attr) throws BadLocationException {
        if (str == null) return;

        if ((getLength() + str.length()) <= limit) {
            super.insertString(offset, str.replaceAll("([^\\d]+){1,3}", "-"), attr);
        } else if (getLength() <= limit) {
            super.insertString(offset, str.substring(0, limit-getLength()).replaceAll("([^\\d]+){1,3}", "-"), attr);
        }
    }
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 (java) [Seleccionar]
str = str.replaceAll("^\\-|[^0-9\\-]|\\-$", "");
        while(str.contains("--")){
            str = str.replaceAll("\\-\\-", "-");
        }


Saludos