我实际上有2个问题。我对正则表达式的理解似乎存在知识差距,所以我想知道是否有人可以帮助我。
1)
function LongestWord(sen) {
var word = /[^\W\d]([a-z]+)[$\W\d]/gi;
var answer = word.exec(sen);
return answer;
}
console.log(LongestWord("9hi3"));
为什么这会按预期返回[hi3, i]
而不是[9hi3, hi]
。我清楚地说明,在一封信开头之前,一个数字或一个非单词字符必须在我的比赛中。我也有贪婪的+符号应该让整个团队嗨。
2)
function LongestWord(sen) {
var word = /[\b\d]([a-z]+)[\b\d]/gi;
var answer = word.exec(sen);
return answer;
}
console.log(LongestWord("hi"));
更重要的是,为什么返回null。 #1是我试图解决这个问题。但你知道我在这里想做什么。
请告诉我,我的想法中出现的问题是什么,而不是给我一个解决方案。如果我不了解我的错误,我会继续重复同样的错误。谢谢!
答案 0 :(得分:2)
让我们使用您的示例字符串9hi3
1)[^\W\d]([a-z]+)[$\W\d]
首先,我们有[^\W\d]
。通常,^
匹配字符串的开头,但是当它在[]
内时,它实际上否定了该块。因此,[^\W\d]
实际上意味着任何一个字符都是字符,而不是数字。这显然会跳过9
,因为这是一个数字,并匹配h
。
下一部分([a-z]+)
符合您的期望,但h
已经匹配,因此它只匹配i
。
然后,[$\W\d]
匹配$
符号,非单词字符或数字。请注意,就像^
一样,$
与[]
内的字符串末尾不匹配。
2)[\b\d]([a-z]+)[\b\d]
对于这一个,您应首先查看exec
的{{3}},了解它可以返回null
的原因。具体做法是:
如果匹配失败,则exec()方法返回null。
所以,你知道比赛失败了。为什么呢?
同样,你的困惑来自于不了解[]
内部特殊字符如何改变意义。在这种情况下,\b
会从匹配单词边界变为匹配退格符。
值得注意的是,您的第二个正则表达式将匹配您测试第一个正则值的字符串9hi3
,因为它以数字开头和结尾。但是,您使用hi
进行了测试。
我希望这些解释对你有所帮助。
为了将来参考,您应该查看documentation。
此外,测试正则表达式的一个很好的工具是RegExp guide on MDN。我强烈建议您使用它来帮助您确切了解正则表达式的作用。