我实际上有两个问题。我对正则表达式的理解似乎存在知识差距,所以我想知道是否有人能帮我。
1)
function LongestWord(sen) {
var word = /[^Wd]([a-z]+)[$Wd]/gi;
var answer = word.exec(sen);
return answer;
}
console.log(LongestWord("9hi3"));
为什么这会返回[hi3, i]
而不是预期的[9hi3, hi]
。我明确指出,在一个字母出现之前,一个数字或一个非单词字符必须在我的匹配中。我还有一个+符号,贪婪应该拿整个群体嗨。
2)
function LongestWord(sen) {
var word = /[bd]([a-z]+)[bd]/gi;
var answer = word.exec(sen);
return answer;
}
console.log(LongestWord("hi"));
更重要的是,为什么会返回null#1是我尝试解决的问题。但你知道我在这里要做什么。
请告诉我我在这两个问题上的想法出了什么问题,而不是给我一个解决方案。如果我不知道自己做错了什么,我就会重蹈覆辙。非常感谢。
让我们使用示例字符串9hi3
来遍历正则表达式
1) [^Wd]([a-z]+)[$Wd]
首先,我们有[^Wd]
。通常,^
与字符串的开头匹配,但当它位于[]
内部时,它实际上会否定该块。所以,[^Wd]
实际上意味着任何一个字符,它是一个单词字符,而不是一个数字。这显然跳过了9
,因为它是一个数字,并且在h
上匹配。
下一部分([a-z]+)
与您所期望的相匹配,只是h
已经匹配,所以它只与i
匹配。
然后,[$Wd]
匹配$
符号、非单词字符或数字。请注意,就像^
一样,$
在[]
内部时与字符串的末尾不匹配。
2) [bd]([a-z]+)[bd]
对于这一个,您应该从查看exec
的文档开始,了解它为什么可以返回null
。具体而言:
如果匹配失败,exec()方法将返回null。
所以,你知道这场比赛失败了。为什么?
同样,你的困惑来自于不理解特殊字符在[]
中是如何改变含义的。在这种情况下,b
从匹配单词边界变为匹配退格字符。
值得注意的是,第二个正则表达式将与测试第一个正则表达式的字符串9hi3
相匹配,因为它以数字开头和结尾。但是,您使用hi
进行了测试。
我希望这些解释对你有所帮助。
为了便于将来参考,您应该查看有关MDN的RegExp指南。
此外,测试正则表达式的一个很好的工具是regexpal。我强烈建议使用它来帮助您准确地了解正则表达式的作用。