我在做表单验证。对于这个名字的限定是:1-50个中文或100位以内的数字或100个以内的英文字母。例如:张三001ab,李四ac……可以3种都包含,顺序不限,但至少要有一种。请问这个正则该怎么写呢?
中文夹杂在里面确实不太好处理,换个思路:
匹配除中文、英文字母、数字以外的字符:[^(a-zA-Z0-9\u4e00-\u9fa5)]
如果匹配不成功再去判断长度超没超过100
如果匹配成功了表示输入了非法字符
谢谢你的提示,我现在只能写到这步:
var oTxtNa=document.getElementById('name'); var oSpanNa=oTxtNa.nextElementSibling || oTxtNa.nextSibling; var reName=/[^(a-zA-Z0-9\u4e00-\u9fa5)]/g; if(reName.test(oTxtNa.value)){ alert('包含非法字符!'); } else{ var reNum=/\d/g; var reLet=/[a-zA-Z]/g; var reChi=/[\u4e00-\u9fa5]/g; if(oTxtNa.value.match(reNum).length<100 && oTxtNa.value.match(reLet).length<100 && oTxtNa.value.match(reChi).length<50){ oSpanNa.style.display='none'; } else{ oSpanNa.style.display='inline-block'; } }
但是这样写,三种文字必须都包含,只要有一种没有就会报错。你还能再帮帮我吗?
@zanetti:
var reNum=/\d/g;
var reLet=/[a-zA-Z]/g;
var reChi=/[\u4e00-\u9fa5]/g;
你把字符串拆开来干嘛?直接取字符串整体的字节数啊
不要直接用length,用length的话汉字的长度只算1.
把双字节的字符转换一下:
例
var name="我是1个ABC";
alert(name.length); // 7
alert(alert(name.replace(/[^\x00-\xFF]/g,'**').length);); //把汉字换成"**",取值得10
@nicky0227:
var reDou=/[^\x00-\xFF]/g; var iByte=oTxtNa.value.replace(reDou,'**').length; if(iByte>300){ oSpanNa.style.display='inline-block'; } else if(iByte==0){ oSpanNa.style.display='inline-block'; } else{ oSpanNa.style.display='none'; }
按照你的提示,我把不包含非法字符时的代码改成这样。可以输入的最大整体字节数是300,但是如果只输入200个数字,现在不会出现提示,实际上是不对的。数字最多只能输入100个。那么只取字符串的整体字节数,是不是就不可以了?
@zanetti: 不懂你说的什么意思了?整体的长度不能超过300了?单独数字又要不能超过100?
@nicky0227: 我在最初的问题中写了限定“最多50个中文、100个数字、100个英文字母”。这些字节数加在一起不就是100+100+100=300,同时每种文字不能超过本身的限制。
^[(\u4e00-\u9fa5){1,50}(0-9){1,100}(a-zA-Z){1,100}]+$