Cita:
Iniciado por luke24 Además hay que sumarle el problema de los caracteres especiales como el "Intro", "Supr" o la barra espaciadora.
Lo siento, de esto no sé nada, excepto de la barra espaciadora que se representa con un espacio sin más, o con un \s.
Pero de lo demás sí que te puedo ayudar:
Código:
function e(q,br) {
document.body.appendChild( document.createTextNode(q) );
if(br!==0) document.body.appendChild( document.createElement("BR") );
}
// positivo o negativo, tres dígitos, y parte decimal opcional con maxima longitud 3 dígitos
var re1=/^-?\d{1,3}(\,\d{1,3})?$/;
var re2=/^[-]?(\d{1,3}([\,]\d{0,3})?)?$/;
// una p o una v con indiferencia de mayúsculas o minúsculas
var re3=/^[pv]$/i;
// una n y una letra cualquiera, con indiferencia de mayúsculas o minúsculas
var re4=/^n[a-záéíóúüñ]$/i;
var re5=/^(n|N)(\D)?$/;
String.prototype.testear=function(re) {
if( re.test(this) )
var comment=" encaja con "+re;
else
var comment=" NO encaja con "+re;
return "\""+this+"\""+comment;
}
e("Expresión regular número derkeNuke:");
e( "12".testear(re1) );
e( "-".testear(re1) );
e( "-12".testear(re1) );
e( "12,".testear(re1) );
e( "-12,".testear(re1) );
e( "1221".testear(re1) );
e( "12,341".testear(re1) );
e( "12,3421".testear(re1) );
e("");
e("Expresión regular número luke24:");
e( "12".testear(re2) );
e( "-".testear(re2) );
e( "-12".testear(re2) );
e( "12,".testear(re2) );
e( "-12,".testear(re2) );
e( "1221".testear(re2) );
e( "12,341".testear(re2) );
e( "12,3421".testear(re2) );
e("");
e("");
e("Expresión regular p ó v derkeNuke:");
e( "p".testear(re3) );
e( "P".testear(re3) );
e( "v".testear(re3) );
e( "V".testear(re3) );
e( "h".testear(re3) );
e( "y".testear(re3) );
e("");
e("");
e("Expresión regular n y letra derkeNuke:");
e( "n".testear(re4) );
e( "np".testear(re4) );
e( "nh".testear(re4) );
e( "vU".testear(re4) );
e( "nU".testear(re4) );
e( "yu".testear(re4) );
e( "Nt".testear(re4) );
e( "Nta".testear(re4) );
e( "Ná".testear(re4) );
e( "NÍ".testear(re4) );
e( "Nñ".testear(re4) );
e( "nÜ".testear(re4) );
e( "n3".testear(re4) );
e("");
e("Expresión regular n y letra luke24:");
e( "n".testear(re5) );
e( "np".testear(re5) );
e( "nh".testear(re5) );
e( "vU".testear(re5) );
e( "nU".testear(re5) );
e( "yu".testear(re5) );
e( "Nt".testear(re5) );
e( "Nta".testear(re5) );
e( "Ná".testear(re5) );
e( "NÍ".testear(re5) );
e( "Nñ".testear(re5) );
e( "nÜ".testear(re5) );
e( "n3".testear(re5) );
Fíjate que en tu expresión regular para los números encajan cosas como "-", "12,", "-12,".
La expresión de p ó v es fácil, supongo que no tendrías problemas con ella, pero por si acaso la he incluído.
Para la de n+letra tienes la segunda letra opcional, no sé si ese era tu deseo. Por lo demás es casi la misma a la expresión regular que te planteo yo, sólo la he puesto como propuesta didáctica
Para juntar las 3... tienes varias opciones:
O poner un if con el testeo de la misma cadena con las 3 expresiones por separado (que es la que yo escogería por ser la más legible..):
Código PHP:
if( re1.test(cadena) || re2.test(cadena) || re3.test(cadena) )
O unir las 3 expresiones regulares en una... La manera sería asi:
Código:
var reTotal=/(re1|re2|re3)/i;
var reTotal=/(^-?\d{1,3}(\,\d{1,3})?$|^[pv]$|^n[a-záéíóúüñ]$)/i;
pero claro, es un poco más liosa, aunque haga lo mismo.
Le elección es tuya.
Espero haberte ayudado.
Un saludo.