jQuery当前正则表达式
我想指定一个具有以下格式的正则表达式jQuery当前正则表达式,jquery,regex,Jquery,Regex,我想指定一个具有以下格式的正则表达式 十, 10点 100.45 这最多可以达到10位,后面是一个数字。(点)和2位小数。我试过这样的东西 $(文档).on(“按键”,“金额”,函数(e){ var regex=new RegExp(“^\d{1,10}(\.\d{2})?$”; var str=String.fromCharCode(!e.charCode?e.which:e.charCode); if(正则表达式测试(str)){ 返回true; } 返回false; }); 这个想
- 十,
- 10点
- 100.45
$(文档).on(“按键”,“金额”,函数(e){
var regex=new RegExp(“^\d{1,10}(\.\d{2})?$”;
var str=String.fromCharCode(!e.charCode?e.which:e.charCode);
if(正则表达式测试(str)){
返回true;
}
返回false;
});代码>
这个想法是:
^$
-从开始到字符串结束
\d{1,10}
-一到十位数字
\.\d{2}
-后跟一个点和两个数字
()?
-哪些是可选的
看来您需要实现两件事:
- 限制实时输入,以便用户只能以所需格式键入数字
- 执行用户输入的最终验证
实时和最终输入验证的正则表达式应该不同,并且它们必须用于不同的事件
看看你是如何做到这一点的
对于实时验证,在按键事件中,使用
var regex = /^\d{0,10}(?:\.\d{0,2})?$/;
var regex = /^\d{1,10}(?:\.\d{2})?$/;
对于最终验证,例如,在模糊事件上,使用
var regex = /^\d{0,10}(?:\.\d{0,2})?$/;
var regex = /^\d{1,10}(?:\.\d{2})?$/;
更新
我增强了演示以允许更复杂的场景:
- 它不允许在结尾的第三个或更多字符之前键入
- 它应该允许通过使用鼠标选择值并键入另一个数字来删除输入
var regex\u final=/^\d{1,10}(?:\.\d{2})$/;
var regex=/^\d{0,10}(?:\.\d{0,2})$/;
var last_input_char='';
$(文件)。关于(“按键”和“金额”,函数(e){
last_input_char=String.fromCharCode(e.charCode);
var包含cimalpoint=/\./.test($(this.val());
if(包含cimalpoint&&/\..[^.]*\./.test($(this.val()+last\u input\u char)){
返回false;
}否则{
var sel_idx=$(this).getCursorPosition();
var real_new_value=$(this).val().splice(sel_idx,0,last_input_char);
var pass=正则表达式测试(实际值和新值);
返回(e.charCode==0 | |/\d/.test(最后一个输入字符)| |
/\./.测试(最后一个输入字符)&&!包含cimalpoint)&&pass;
}
});
$(文档)。关于(“模糊”,“金额”,函数(e){
var isValidAsPerRx=regex_final.test($(this.val());
如果(!isValidAsPerRx){
$('金额').removeClass(“右”);
$('金额').addClass(“错误”);
}否则{
$('金额').addClass(“右”);
$('#Amount')。删除类(“错误”);
}
});
//添加string.insert函数
String.prototype.splice=函数(idx、rem、str){
返回this.slice(0,idx)+str+this.slice(idx+Math.abs(rem));
};
//添加获取插入符号位置的函数
(函数($,未定义){
$.fn.getCursorPosition=函数(){
var el=$(this.get)(0);
var-pos=0;
如果('selectionStart'在el中){
pos=el.selectionStart;
}else if(文档中的“选择”){
el.focus();
var Sel=document.selection.createRange();
var SelLength=document.selection.createRange().text.length;
Sel.moveStart('字符',-el.value.length);
pos=Sel.text.length-SelLength;
}
返回pos;
}
})(jQuery)代码>
。对{
背景:白色;
颜色:黑色;
}
.错了{
背景:黄色;
颜色:红色;
}
谢谢,这是我的代码中的内容,但它不起作用。文本框不允许我键入任何$(document).on(“keypress”、“#Amount”,函数(e){var regex=new RegExp(“^\d{1,10}(\.\d{2}))$”;var str=String.fromCharCode(!e.charCode?e.which:e.charCode);if(regex.test(str)){return true;}return false;})@Yass,请创建一个并在您的问题中链接它。var regex=/^\d{1,10}(?:\.\d{2})$/
@Yass,WS是正确的,如果使用new RegExp()
,则必须使用literal(/
)语法或双转义斜杠。最佳实践,只是习惯问题。风格这里没什么大不了的。问题是你应该检查框的值,而不是按下的键。@Yass:看一看。它能像预期的那样工作吗?@WiktorStribiżew,有效。我发布了答案。我注意到这个解决方案有一个问题。在用户输入初始值后,如果用户希望通过选择文本框中的所有文本来输入其他内容,则必须使用删除按钮。有没有办法不使用删除按钮第二次输入值?您的意思是键入12345.67
后,您想将光标放在2
和3
之间,键入9
,数字将变为12945.67
?请提供详细信息。首先键入1234.56,然后使用鼠标选择文本框中的所有数字,并尝试键入任何其他有效数字。我修改了演示代码。我认为你根本不会使用我的演示,我假设你有一个工作代码。请注意,我不确定这是否适用于所有浏览器,我只是收集了一些示例,并将它们合并到一个解决方案中。可以自由地进行更多的测试,如果某些东西没有按预期工作,可以留下更多的反馈。