正则表达式有问题



我实际上有两个问题。我对正则表达式的理解似乎存在知识差距,所以我想知道是否有人能帮我。

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。我强烈建议使用它来帮助您准确地了解正则表达式的作用。

相关内容

最新更新