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
这最多可以达到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;
});

这个想法是:

  • ^$
    -从开始到字符串结束
  • \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,然后使用鼠标选择文本框中的所有数字,并尝试键入任何其他有效数字。我修改了演示代码。我认为你根本不会使用我的演示,我假设你有一个工作代码。请注意,我不确定这是否适用于所有浏览器,我只是收集了一些示例,并将它们合并到一个解决方案中。可以自由地进行更多的测试,如果某些东西没有按预期工作,可以留下更多的反馈。