正则表达式有问题

时间:2015-12-05 05:58:02

标签: javascript regex

我实际上有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是我试图解决这个问题。但你知道我在这里想做什么。

请告诉我,我的想法中出现的问题是什么,而不是给我一个解决方案。如果我不了解我的错误,我会继续重复同样的错误。谢谢!

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