如何在JavaScript中判断一个字符串是否包含某个特定字符?

449

我有一个页面上有一个文本框,用户应该输入一个由24个字符组成(字母和数字,大小写不敏感)的注册码。我使用maxlength属性限制用户输入24个字符。

注册码通常是由一组由破折号分隔的字符组成的,但我希望用户在输入代码时不要输入破折号。

如何编写JavaScript代码(不使用jQuery),以检查用户输入的字符串中不含有破折号或更好地说只包含字母数字字符?


2
这里找到的答案 http://stackoverflow.com/questions/3192612 包含了如何验证字母数字的信息。 - JasCav
1
学习正则表达式,请访问:http://www.regular-expressions.info。 - Felix Kling
对于 jQuery 爱好者,你们应该并且可以使用 inArray - JonH
3
如何格式化输入并非人类的问题,而是计算机的问题。将用户输入的所有非字母字符删除,检查结果是否为24个字符长,然后进行验证。用户真的很讨厌格式化输入。 - tggagne
21个回答

722

那非常有帮助。作为一名Python程序员,我正在使用它来替换“in”关键字(这可能是非正统的,我不确定),但它适用于不止一个字符。 - trevorKirkby
1
我不明白这个回答是怎么被投票的。我可以看到很多人通过谷歌来到这里。更好的方法肯定是使用正则表达式。 - Spock
37
你需要使用正则表达式来检查单个字符吗?这会增加很多额外的开销,而得到的结果和内置函数完全相同。有很多人不理解正则表达式,通常最简单的答案是最好的。 - kemiller2002
我会选择/hello/g.test(your_string)。虽然indexOf也可以用,但是我认为正则表达式测试更能清楚地说明你想要实现的目标。如果我想在一个字符串中查找一系列字符,那么索引是无关紧要的。 - Joe Maffei
indexOf()的文档 - cgaldiolo

140

使用ES6的MDN文档 .includes()

"FooBar".includes("oo"); // true

"FooBar".includes("foo"); // false

"FooBar".includes("oo", 2); // false

E: 不被IE支持 - 作为替代,您可以使用波浪线运算符~按位取反),搭配.indexOf()方法。

~"FooBar".indexOf("oo"); // -2 -> true

~"FooBar".indexOf("foo"); // 0 -> false

~"FooBar".indexOf("oo", 2); // 0 -> false

当与数字一起使用时,波浪线操作符会有效地执行~N => -(N+1)。将其与双重否定!!(逻辑非)一起使用,可以将数字转换为布尔值:

!!~"FooBar".indexOf("oo"); // true

!!~"FooBar".indexOf("foo"); // false

!!~"FooBar".indexOf("oo", 2); // false

 

简单易读,返回布尔值。适用于不需要正则表达式的情况。 - bryanbraun
4
请注意,IE不支持includes方法。 - Bonez024
includes 的第二个参数是 position,默认值为 0。 - Timo

72

如果您有存储在变量foo中的文本:

if (! /^[a-zA-Z0-9]+$/.test(foo)) {
    // Validation failed
}

这将测试并确保用户输入了至少一个字符,并且仅输入了字母或数字。


20

检查字符串(单词/句子...)是否包含特定的单词/字符

if ( "write something here".indexOf("write som") > -1 )  { alert( "found it" );  } 

它能在IE上运行吗?--> https://dev59.com/FHA75IYBdhLWcg3wFE6b - Ger Soto

15

ES6 包含在 String 的 prototype 中的内置方法 (includes),可用于检查字符串是否包含另一个字符串。

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be')); 

可以使用以下 polyfill 在不支持的浏览器中添加此方法。(来源)

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }
    
    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}


10

你们想得太复杂了。只需使用简单的正则表达式,它就是你最好的朋友。

var string1 = "Hi Stack Overflow. I like to eat pizza."
var string2 = "Damn, I fail."

var regex = /(pizza)/g // Insert whatever phrase or character you want to find

string1.test(regex); // => true
string2.test(regex); // => false

5分钟学会正则表达式?


因此,要在实际操作中使用它,您只需在选择中运行它:if ( string1.test(regex) ) { alert("他喜欢披萨!"); } - Adam McArthur
你的字母数字测试将是... var regex = /^[a-z0-9]+$/i - Adam McArthur
4
这是相反的。请参见https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/testregexObj.test(str)。 - Ralph Yozzo
它反过来了吗?regex.test(string1) - Artem P
你的示例方法是反过来的。应该是 regex.test(str)。(str.match(regex) 类似,但不返回布尔值。) - jsejcksn

8

使用正则表达式来完成这个任务。

function isAlphanumeric( str ) {
 return /^[0-9a-zA-Z]+$/.test(str);
}

1
这将检查确切地 一个 数字,并且不会接受所有字母数字字符,正如 OP 所需。 - cdhowie
1
@cdhowie.. 忘了加上 +,但我也误读了问题... 谢谢你指出来。 - Gabriele Petrioli

6

var inputString = "this is home";
var findme = "home";

if ( inputString.indexOf(findme) > -1 ) {
    alert( "found it" );
} else {
    alert( "not found" );
}


6

如果您想要在字符串的开头或结尾搜索字符,您可以使用startsWithendsWith方法。

const country = "pakistan";
country.startsWith('p'); // true
country.endsWith('n');  // true

5

Kevin的回答是正确的,但需要使用以下“魔法”数字:

var containsChar = s.indexOf(somechar) !== -1;

如果出现这种情况,你需要知道-1代表未找到

我认为更好的版本应该是:
var containsChar = s.indexOf(somechar) >= 0;

根据原始文档当前标准草案,如果未找到字符串,indexOf()将返回*-1。因此,它与使用0*相比并没有更多的“魔力”。 - Uyghur Lives Matter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接