用于数字验证的表达式

Reg Expression for number validation

本文关键字:表达式 验证 数字 用于      更新时间:2023-09-26

我需要有文本区(或输入),允许负号,百分号和十进制数。即3000,-3.5,50%,-50.5% -都有效。
我找到了这个例子,并将正则表达式调整为

/^['-]?[0-9]+'.?[0-9]*[%]{0,1}$/

我的问题是我不能在输入数字之前加上负号。

我的代码是:

$(function() {
  var pastValue, pastSelectionStart, pastSelectionEnd;
  $("textarea.aaa").on("keydown", function() {
    pastValue = this.value;
    pastSelectionStart = this.selectionStart;
    pastSelectionEnd = this.selectionEnd;
  }).on("input propertychange", function() {
    var regex = /^['-]?[0-9]+'.?[0-9]*[%]{0,1}$/;
    if (this.value.length > 0 && !regex.test(this.value)) {
      this.value = pastValue;
      this.selectionStart = pastSelectionStart;
      this.selectionEnd = pastSelectionEnd;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea name="myText" class="aaa" /></textarea>

在代码片段中使用的正则表达式也允许负号。用户只能在开始时添加一次负号。你也可以在keydown事件上使用它,而不需要只在onsubmit上使用它。请检查代码片段以获得更多的理解。

$(function() {
  var pastValue, pastSelectionStart, pastSelectionEnd;
  $("textarea.aaa").on("keydown", function() {
    pastValue = this.value;
    pastSelectionStart = this.selectionStart;
    pastSelectionEnd = this.selectionEnd;
  }).on("input propertychange", function() {
    var regex = /^-?'d*'.?'d{0,6}$/;
    if (this.value.length > 0 && !regex.test(this.value)) {
      this.value = pastValue;
      this.selectionStart = pastSelectionStart;
      this.selectionEnd = pastSelectionEnd;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea name="myText" class="aaa" /></textarea>

这里的问题是,您的regex强制要求至少有一个数字,因此当您键入-时,它会失败。

要使其工作,使数字部分可选,并使-也可选(-?语法):

var regex = /^-?([0-9]+'.?[0-9]*%?)?$/;
//            ^^
//              ^                 ^^

请注意,现在的问题是,仅由-组成的字符串将传递正则表达式。

一起:

$(function() {
  var pastValue, pastSelectionStart, pastSelectionEnd;
  $("textarea.aaa").on("keydown", function() {
    pastValue = this.value;
    pastSelectionStart = this.selectionStart;
    pastSelectionEnd = this.selectionEnd;
  }).on("input propertychange", function() {
    var regex = /^-?(?:[0-9]+'.?[0-9]*%?)?$/;
    if (this.value.length > 0 && !regex.test(this.value)) {
      this.value = pastValue;
      this.selectionStart = pastSelectionStart;
      this.selectionEnd = pastSelectionEnd;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea name="myText" class="aaa" /></textarea>