1

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

例如:在句子中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

4 回答 4

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不会逃脱,您可能还想考虑逃脱它

于 2013-06-22T01:13:58.330 回答
1

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

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

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

于 2013-06-22T01:15:20.867 回答
1

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

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

于 2013-06-22T01:26:35.297 回答
0

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

于 2013-06-22T01:14:02.007 回答