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

Get list of words containing substring in string

本文关键字:字符串 单词 列表 包含 获取      更新时间:2023-09-26

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

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

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

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

要用字符串做这样的事情,indexOf不够好,因为你不能有异常。regexp就足够好了。您的条件是"忽略该子字符串的任何实例,如果它们立即"。这意味着你应该使用否定的展望((?!))。

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

var lowercase_name = subject.toLowerCase();
var has_sn = lowercase_name.match(/sn(?!['t])/);
if(has_sn){
    //do something
}
  • (?!) =负面展望。搜索sn不跟随!
  • 后面的内容
  • [] = "或"字符。匹配括号内的任意字符。

现在,如果您想创建更复杂的任务,您应该查看一些regexp教程

您需要使用正则表达式:

subject.match(/^sn/i)

^表示从字符串的开头匹配,除了字符sn在开头。末尾的i表示不区分大小写的匹配,因此您不必将subject转换为小写。如果在sn开始之前有空格或任何其他字符,这将不起作用。如果你想支持这些案件,你就必须相应地处理它们。

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

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

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

你可以看到这个正则表达式是如何工作的:link

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

此方法将按您所期望的方式处理序列号,而不是仅仅忽略您想到的情况。你永远不应该假设用户会写出合适的英语单词,或者英语,甚至是有任何意义的单词。只忽略"sn"后面跟着"nt"或"n't"的单词是一种糟糕的方法。如果用户键入"snooze",您仍然会将其匹配为序列号,尽管我认为您不会真的想要这样。

这里可以使用正则表达式。表达式sn[^t']将匹配任何包含st,但后面没有撇号或字母t的字符串。

在JavaScript中,代码看起来像这样:
var has_sn = /sn[^t']/.test(lowercase_name)
if (has_sn) { /* do something */ }

你可以使用正则表达式:

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

不使用正则表达式的解决方案:

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
}