Reg Expression用于数字验证

时间:2016-08-31 10:23:02

标签: javascript jquery regex validation

我需要有textarea(或输入),允许负号,百分号和十进制数。即3000,-3.5,50%, - 50.5% - 全部有效 我找到this example并将正则表达式调整为

/^[\-]?[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>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

代码段中使用的正则表达式也允许使用减号。用户只能在开头添加一次减号。您可以在keydown事件上使用它,也不需要仅在提交时使用它。请查看摘要以获取更多信息。

&#13;
&#13;
$(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;
    }
  });
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea name="myText" class="aaa" /></textarea>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这里的问题是你的正则表达式必须至少有一个数字,所以当你输入-时它就会失败。

要使其正常工作,请将数字部分设为可选,同时使-可选(-?语法):

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>