谁能解释我的正则表达式有什么问题?

时间:2013-06-22 01:09:30

标签: javascript regex

我有一个小正则表达式的问题。在一个句子中,我想匹配一个或多个单词,前后允许的唯一字符是一个可选的空格字符。

例如:在Ut volutpat egestas volutpat.句中我想匹配volutpat而不是volutpat.,除非我专门寻找volutpat.

以下是代码(jsFiddle):

var sentence = 'Ut volutpat egestas volutpat.',
    word = 'volutpat',
    regex = new RegExp('[\s]?' + word + '[\s]?', 'g');

console.log(sentence.match(regex));

不幸的是在控制台中,上面的代码会返回两个匹配项:

[ "volutpat", "volutpat" ]

请注意,如果必须匹配,word = 'volutpat egestas'word = 'volutpat.'也必须有效。

4 个答案:

答案 0 :(得分:6)

在动态构建正则表达式时,您需要记住,任何反斜杠都需要再次转义:

var sentence = 'Ut volutpat egestas volutpat.',
    word = 'volutpat',
    regex = new RegExp('[\\s]?' + word + '[\\s]?', 'g');

此外,您可能希望检查空格或开始或结束,而不是空格 - 所以:

var sentence = 'Ut volutpat egestas volutpat.',
    word = 'volutpat',
    regex = new RegExp('(^|\\s)' + word + '(\\s|$)', 'g');

假设word不会被转义,您可能还想查看escaping that, too

答案 1 :(得分:1)

您希望边缘匹配 空格字符或行的开头/结尾。所以:

(\s|^)(volutpat)(\s|$)

即使搜索词本身包含一个点,这也应该有效。这是in action

答案 2 :(得分:1)

那是因为您将空格指定为可选空格,因此它也会匹配除空格之外没有边界或边界的实体。

在你指定的句子中,单词出现两次,第一次与空格匹配,第二次与单词匹配(周围没有任何空格)。

答案 3 :(得分:0)

除非用反斜杠word转义,否则您在\中输入的任何特殊字符都将被视为此类字符。您提供的示例将匹配2次,因为有两个匹配的单词。