如果输入的值包含子字符串'sn',我会运行一个脚本,但如果它们后面紧跟字母t或撇号,我需要它忽略该子字符串的任何实例。
原因是输入的值包含设备的序列号,脚本可以选择序列号,因为前面有字母'sn'。问题是,如果用户输入诸如“不是”或“不是”之类的单词(可以是否有撇号,取决于谁输入它),脚本将获得“sn”的最后一个实例。我需要它完全忽略这些词。
我用来检查'sn'的代码是......
var lowercase_name = subject.toLowerCase();
var has_sn = lowercase_name.indexOf("sn") > -1;
if(has_sn === true){
//do something
}
答案 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
}