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
String regex = ?????????
String test = "123asd--asd-12312-asd-11-1333-122";
System.out.println(test.replaceAll(regex, test));
Gracias
La longitud de las cadenas es la misma que pusiste en los ejemplos, en esos formatos? O es solo a modo de explicación?
entre guiones puede ir cualquier cantidad de dígitos, muchas gracias por tu interés
y puede haber n cantidad de guiones?
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
Fijate con esta a ver si hace lo que necesitás:
^[\d]+(\-?\d)*
Me marca un error:
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
La verdad no te sabría responder el porque del error (Recién estoy comenzando a aprender Java), pero intentá de la siguiente manera:
^[\\d]+(\\-?\\d)*
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
se me ocurrió algo así:
test.replaceAll("([^\d]+){1,3}", "-")
no lo probé.
saludos
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?
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);
}
}
Esto funciona cuando hacen un copy paste en el textfield pero no cuando se escribe de forma manual:
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);
}
}
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.
De todas formas, muchas gracias, a ver si alguien se anima a solucionar el pequeño desperfecto del regex, saludos :)
Solucionado, tuve que aprender regex :(, adjunto el código:
str = str.replaceAll("^\\-|[^0-9\\-]|\\-$", "");
while(str.contains("--")){
str = str.replaceAll("\\-\\-", "-");
}
Saludos