谁能解释一下我的正则表达式出了什么问题?

Could anyone explain what's wrong with my regex?

本文关键字:正则表达式 什么 问题 我的 一下 能解释      更新时间:2023-09-26

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

E。g:在句子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.'也必须工作。

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

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没有转义,您可能还需要考虑转义。

您希望边缘匹配空格字符或行首/行尾。所以:

('s|^)(volutpat)('s|$)

即使搜索词本身包含点,这也应该有效。

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

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

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