获取字符串中包含子字符串的单词列表

时间:2016-09-01 21:45:15

标签: javascript

如果输入的值包含子字符串'sn',我会运行一个脚本,但如果它们后面紧跟字母t或撇号,我需要它忽略该子字符串的任何实例。

原因是输入的值包含设备的序列号,脚本可以选择序列号,因为前面有字母'sn'。问题是,如果用户输入诸如“不是”或“不是”之类的单词(可以是否有撇号,取决于谁输入它),脚本将获得“sn”的最后一个实例。我需要它完全忽略这些词。

我用来检查'sn'的代码是......

var lowercase_name = subject.toLowerCase();
var has_sn = lowercase_name.indexOf("sn") > -1;
if(has_sn === true){
    //do something
}

5 个答案:

答案 0 :(得分:2)

您想要使用正则表达式:

subject.match(/^sn/i)

^表示从字符串的开头匹配,在开始时期望字符sn。最后的i代表不区分大小写的匹配,因此您不必将subject转换为小写。如果在sn开始之前有空格或任何其他字符,则无效。如果您想支持这些案例,您必须相应地处理它们。

如果您知道序列号中可以预期的所有字符,则可以使用正则表达式捕获组来匹配整个序列号。以下正则表达式可用于将任何SN与数字或单词匹配:

/^(sn[0-9a-z]+)/i

[0-9a-z]+表示任何数字(0-9)和任何字母字符(a-z)。 +表示匹配这些数字/字符中的一个或多个,并且由于它不区分大小写匹配,因此它将匹配大写和小写字符。该匹配将以第一个未列出的字符结束,例如,空格,符号(+-等)等。

您可以看到此正则表达式的工作原理:link

正如您在链接示例中所看到的,您可以检查.match是否返回null,在这种情况下,这意味着它没有匹配任何内容。

这种方法可以按照您的预期处理序列号,而不是仅仅忽略您所使用的案例。你永远不应该假设用户会写出正确的英语单词,英语甚至是任何有意义的单词。忽略只有" sn"之后是" nt"或" n&#t;#34;是一个糟糕的方法。如果用户输入"小便",您仍然会将其与序列号相匹配,但我并不认为您真的想要这样。

答案 1 :(得分:2)

要使用字符串做类似的事情,indexOf不够好,因为你不能有异常。虽然是正则表达式,但还有什么好处。您的条件是“忽略该子字符串的任何实例(如果它们是立即”)。这意味着你应该使用负向前看((?!))。

在你的情况下,好的正则表达式应该是:

var lowercase_name = subject.toLowerCase();
var has_sn = lowercase_name.match(/sn(?!['t])/);
if(has_sn){
    //do something
}
  • (?!) =负面展望未来。在sn
  • 之后搜索!后面没有内容
  • [] = “或”字符。匹配括号内的任何字符。

现在,如果你想做更复杂的任务,你应该看一些regexp tutorials

答案 2 :(得分:1)

您可以在此处使用正则表达式。表达式sn[^t']将匹配包含st的任何字符串,但没有撇号或紧随其后的字母t。

在JavaScript中,代码如下所示:

var has_sn = /sn[^t']/.test(lowercase_name)
if (has_sn) { /* do something */ }

答案 3 :(得分:1)

您可以使用正则表达式:

var name = "name"
var patt = /sn[^t']/i
if(patt.test(name)){
    //do something
}

答案 4 :(得分:1)

没有正则表达式的解决方案:

var lowercase_name = subject.toLowerCase();
var index = lowercase_name.indexOf("sn");
var char = lowercase_name.substring(index+2, index+3);
if(index != -1 &&  char != "t" &&  char != "'"){
   //do something
}