Jquery搜索没有找到符号

时间:2014-09-30 04:16:38

标签: jquery regex

我有一个文本输入和输入按钮。我想阻止数字输入。

<input type="text" name="lastNameSend" id="lastNameSend" placeholder="Surname" class="sendFormInput"></input>
<input id="sendPhysButton" class="button button_at_left" type="submit">

我使用jquery regexp:

$(document).on("click","#sendPhysButton", function(event)
{
    if ($("#lastNameSend").val().search("/[0-9]*/i"))
    {
        alert($("#lastNameSend").val().search("/[0-9]*/i"));
    }
    event.preventDefault();
});

由于某种原因,它总是警告-1。当我输入数字时它是-1,当我输入字母时它是-1。 这是一个小提琴:http://jsfiddle.net/jupnzty0/3/ 怎么了?

2 个答案:

答案 0 :(得分:2)

String.search语义

String.search接收RegExp。如果传入非RegExp对象obj(在您的情况下,它是一个String),则使用new RegExp(obj)将其隐式转换为RegExp对象。

如果成功,search将返回字符串中正则表达式的第一个匹配项的索引。否则,它返回-1。

转载自MDN参考。

如何将参数传递给String.search

请注意/<regexp>/<flags>是RegExp文字的语法。将字符串传递给RegExp构造函数时,只需要传入<regexp>,再加上第二个参数中的标志。例如,new RegExp("[a-z]", "i")/[a-z]/i在功能方面是等价的(如果有任何差异,那么前者是对象,后者是文字)。

请注意,String literal和RegExp文字对于转义特殊字符有不同的规则。例如,new RegExp("\\\\/")/\\\//在功能上是等效的,两者都测试子串\/

解决方案

回到你的代码,有一些问题:

  • 引用意味着您将"/[0-9]*/i"作为字符串传递,隐式转换使其尝试匹配/,然后匹配0或更多数字,然后/,然后i
  • 删除引号,/[0-9]*/i可以匹配* 或更多量词的空字符串,这意味着它可以在任何字符串中找到匹配项。
  • i标志是多余的 - 它不会影响[0-9]
  • [0-9]可缩短为\d,但不是必须的。
  • 您对返回值的处理不正确。如果要检查正则表达式是否与正则表达式匹配,请比较>= 0返回的索引。如果要检查正则表达式是否与正则表达式匹配。比较< 0返回的索引。

正确的解决方案是:

if ($("#lastNameSend").val().search(/[0-9]/) >= 0) {
    // Found invalid character
}

如果你想传递一个字符串,"[0-9]"也可以。

有一种更方便的方法 - RegExp.test,如果在字符串中找到模式,则返回true,否则返回false

if (/[0-9]/.test($("#lastNameSend").val())) {
    // Found invalid character
}

答案 1 :(得分:1)

这里有很多事情会阻碍,但两个大的引用正则表达式并使用'*'。试试这个:alert($("#lastNameSend").val().search(/\d/));我还更新了您的fiddle