允许字母数字和连字符的正则表达式测试保持返回false

时间:2018-01-31 17:00:08

标签: javascript jquery regex

我试图通过键入或粘贴输入使用jQuery和regex禁用某些值的输入(任何不是字母数字或连字符应该返回false并且调用e.preventDefault()来停止输入)。每次我运行这个测试时,无论输入是什么都会返回false而失败,我无法弄清楚我在这里做错了什么。

当我在节点控制台valid.test("hello-world")(或变量等于" hello-world")中运行测试时,它返回为真,当我valid.test("hello_world")它来时返回为假,但当我使用下面的代码执行此操作时,无论输入如何,每次都会返回false。

我的代码:

jQuery('#input').on('keydown paste', function(e) {
  var input = e.target.value;
  var isValid = /^[a-zA-Z\d-]+$/;
  var tester = isValid.test(input);

  if (tester === false) {
    e.preventDefault();
    console.log("Input allowed? " + tester);
  } else if (tester) {
      console.log("Input allowed? " + tester);
  }
});

在节点控制台中,我得到以下结果:

"hello-world" = true
"hello_world" = false
"hello." > false
"goodness gracious" = false
"goodness-gracious" = true
"goodness123" = true
"goodness!!" = false

我在这里缺少什么?

编辑:我创建了一个codepen来显示我得到的结果: https://codepen.io/anon/pen/JpdMgM

3 个答案:

答案 0 :(得分:2)

您需要转义字符类中的/^[a-zA-Z\d\-]+$/。因此,您的正则表达式将为var data = ["hello-world","hello_world","hello.","goodness gracious","goodness-gracious","goodness123","goodness!!"], result = data.map(word => /^[a-zA-Z\d\-]+$/.test(word)); console.log(result);



_innerInterfaceMock.Raise(o => o.OnCompleted+=null, new EventArgs());




答案 1 :(得分:2)

您需要将keypresspaste的逻辑分开,因为e.preventDefault()导致您遇到问题。使用this answer中所示的相同逻辑,您可以测试粘贴的输入。



let r = /^[a-zA-Z\d-]+$/

$('#input').bind({
  keydown: function(e) {
    return r.test(e.key)
  },
  paste: function(e) {
    if(!r.test(e.originalEvent.clipboardData.getData('text'))) {
      e.preventDefault()
    }
  }
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input id="input"/>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

对于这两个事件,您将在内容中出现输入值之前获取输入值。

对于“粘贴”事件,您可以使用类似

的内容
$("#textareaid").bind("paste", function(e){
    // access the clipboard using the api
    var pastedData = e.originalEvent.clipboardData.getData('text');
    alert(pastedData);
} );

请参阅this以获取进一步的参考。

使用“keydown”,像ctwheels的回答可以起作用。