【问题标题】:javascript indexof regex A-Za-z0-9 always returns falsejavascript indexof 正则表达式 A-Za-z0-9 总是返回 false
【发布时间】:2018-03-10 18:16:32
【问题描述】:

我已经创建了一个 JS fiddle https://jsfiddle.net/95r110s9/#&togetherjs=Emdw6ORNpc

HTML

<input id="landlordstreetaddress2" class="landlordinputs" onfocusout="validateinputentries()" />

JS

validateinputentries(){

landlordstreetaddress2 = document.getElementById('landlordstreetaddress2').value;

 goodcharacters = "/^[a-zA-Z0-9#.,;:'\s]+$/gi";

 for (var i = 0; i < landlordstreetaddress2.length; i++){

  if (goodcharacters.indexOf(landlordstreetaddress2.charAt(i)) != -1){

       console.log('Character is valid');

  }

 }

}

它从输入中提取值并运行 indexOf 正则表达式,其中包含 A-Z a-z 和 0-9 以及一些附加字符。

问题是它可以与 BCDEFG...etc 和 12345...etc 的条目一起使用,但是当我输入“A”或“Z”或“0”或“1”时,它返回不正确。

我需要它返回与 0123456789、ABCDEF...XYZ 和 abcdef...xyz 相同的内容

我应该指出,以下确实按预期工作:

var badcharacters = "*|,\":<>[]`\';@?=+/\\";
badcharacter = false;

//firstname
for (var i = 0; i < landlordfirstname.value.length; i++){

   if (badcharacters.indexOf(landlordfirstname.value.charAt(i)) != -1){

        badcharacter = true;
        break;
   }

   if(landlordfirstname.value.charAt(0) == " "){

        badcharacter = true;
        break;
   }

}

【问题讨论】:

  • 呃,那不是正则表达式。那是一个带有正则表达式内容的字符串。 indexOf 是一个字符串方法,而不是一个正则表达式。
  • 代码似乎也成为The Horror of Implicit Globals 的牺牲品(披露:这是我贫血的小博客上的帖子)。声明你的变量。

标签: javascript regex indexof


【解决方案1】:

String.prototype.indexOf()

indexOf() 方法返回调用 String 对象中第一次出现指定值的索引,从 fromIndex 开始搜索。如果未找到该值,则返回 -1。

因此,您正在尝试搜索此值"/^[a-zA-Z0-9#.,;:'\s]+$/gi",在输入的字符串中将找到“never”。

您实际上想根据输入的值测试该正则表达式。

/^[a-zA-Z0-9#.,;:'\s]+$/gi.test(landlordstreetaddress2)

function validateinputentries() {
  var landlordstreetaddress2 = document.getElementById('landlordstreetaddress2').value;

  if (/^[a-zA-Z0-9#.,;:'\s]+$/gi.test(landlordstreetaddress2)) {
    console.log('Characters are valid');
  } else {
    console.log('Characters are invalid');
  }
}
&lt;input id="landlordstreetaddress2" class="landlordinputs" onfocusout="validateinputentries()" /&gt;

【讨论】:

  • 我认为链接不够大。
  • 它的意思是讽刺/幽默。没必要把它做成h3。 (但显然你可以随意!:-))
  • @T.J.Crowder 是的,我理解其中的讽刺/幽默。但是,我意识到这是一个巨大的文本。!
  • 太奇怪了,那为什么会这样 var badcharacters = "*|,\":[]`\';@?=+/\\"; badcharacter = false; for (var i = 0; i
  • @TonyChapdelaine 这不行。什么情况?你可以在你的问题中发布吗?
【解决方案2】:

您正在尝试结合两种不同的测试字符串的方法——一种方法是使用正则表达式;另一种方法是根据允许的字符列表检查每个字符。如果您没有将其声明为字符串,那么您最终会根据 的列表检查每个字符是否是正则表达式。

这些方法相互冲突;您需要选择其中一个。

检查每个字符:

这与您尝试的最接近。您不能像在正则表达式中那样在此处使用字符范围(如 a-zA-Z);您必须单独拼出每个允许的字符:

var validateinputentries = function() {
  var address = document.getElementById('landlordstreetaddress2').value;
  var goodcharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789#.,;:' ";
  var badcharactersfound = false;
  for (var i = 0; i < address.length; i++) {
    if (goodcharacters.indexOf(address.charAt(i)) == -1) {
      badcharactersfound = true;
      console.log("not allowed: ", address.charAt(i));
    }
  }
  if (badcharactersfound) {
    // Show validation error here
  }
}
&lt;input id="landlordstreetaddress2" class="landlordinputs" onfocusout="validateinputentries()" /&gt;

正则表达式

正则表达式版本要简单得多,因为正则表达式完成了大部分工作。您不需要单步执行字符串,只需针对正则表达式测试整个字符串并查看结果。在这种情况下,您要查看输入是否包含任何不允许的字符,因此您要使用字符例外规则:[^abc] 将匹配任何不是 a、b 或 c 的字符。您不想将匹配锚定到字符串的开头或结尾,就像您对初始 ^ 和尾随 $; 所做的那样。你可以省略 + 因为你不关心是否有连续的坏字符,你只关心它们是否存在。

var validateinputentries = function() {
  var address = document.getElementById('landlordstreetaddress2').value;
  var regex = new RegExp("[^a-zA-Z0-9#.,;:'\\s]","g")
  var badcharactersfound = address.match(regex);
  // or the above two lines could also have been written like this:
  // var bad = address.match(/[^a-zA-Z0-9#.,;:'\s]/g)
  // In either case the "g" operator could be omitted; then it would only return the first bad character.
  if (badcharactersfound) {
    console.log("Not allowed: ", badcharactersfound);
  }
}
&lt;input id="landlordstreetaddress2" class="landlordinputs" onfocusout="validateinputentries()" /&gt;

【讨论】:

  • RegExp("[^a-zA-Z0-9#.,;:'\s]","g") => RegExp("[^a-zA-Z0-9#.,;:'\\s]","g")/[^a-zA-Z0-9#.,;:'\s]/g
  • 德拉特。感谢您指出这一点,我已经更正了答案。
猜你喜欢
  • 2015-01-07
  • 2021-11-09
  • 2010-12-11
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多