Javascript中的RegExp允许部分字符串匹配';曼彻斯特';但不匹配';曼彻斯特路';

Javascript中的RegExp允许部分字符串匹配';曼彻斯特';但不匹配';曼彻斯特路';,javascript,regex,Javascript,Regex,我想在我的网络表单中搜索“曼彻斯特”,它搜索我的mongoDB。我不想要街道或道路或任何包含曼彻斯特的东西,例如“戈德曼彻斯特”。我只想要城市/字符串“Manchest”或类似“Manchest”或“Manchester”的部分,这样我就可以发现拼写错误。 在我开始之前,我得到的答案像是“戈德曼彻斯特”和“曼彻斯特路”以及正确的“曼彻斯特”。 我通过在RegExp中使用“^”成功地摆脱了“godmachester”匹配。 然后,我使用以下RegExp语句成功地摆脱了“曼彻斯特路”: new Re

我想在我的网络表单中搜索“曼彻斯特”,它搜索我的mongoDB。我不想要街道或道路或任何包含曼彻斯特的东西,例如“戈德曼彻斯特”。我只想要城市/字符串“Manchest”或类似“Manchest”或“Manchester”的部分,这样我就可以发现拼写错误。 在我开始之前,我得到的答案像是“戈德曼彻斯特”和“曼彻斯特路”以及正确的“曼彻斯特”。 我通过在RegExp中使用“^”成功地摆脱了“godmachester”匹配。 然后,我使用以下RegExp语句成功地摆脱了“曼彻斯特路”:

new RegExp('^(?!Manchester Road|Manchester Old Road)' + req.query.search, 'i') :
现在的问题是,我必须明确说出我不想要的每个单词/短语(例如,“曼彻斯特路”、“利兹路”、“利物浦路”等)。这将是一个庞大的阵列,不好。 我真的需要一个javascript RegExp,它可以删除任何包含“road”的内容。所以我试了一下:

new RegExp('^((?!road).)*$' + req.query.search, 'i') :
但它在我的javascript中返回零结果。但是,如果使用

/^((?!road).)*$/i

在正则表达式测试工具中,它可以很好地工作。因此,可能是我将其写入javascript的方式…

您可以使用动态构建的正则表达式,如

new RegExp('^(?!.*\\b' +  req.query.search +'(?:\\s+Old)?\\s+Road\\b).*\\b' + req.query.search + '\\b', 'i')

正则表达式是

^(?!.*\bManchester(?:\s+Old)?\s+Road\b).*\bManchester\b
详细信息

  • ^
    -字符串的开头
  • (?!.*\b曼彻斯特(?:\s+Old)?\s+Road\b)
    -如果曼彻斯特是一个完整的单词,则匹配失败,然后是可选的1+空格和
    Old
    ,然后是1+空格和
    Road
  • *\bManchester\b
    -任何后跟
    Manchester
    作为一个单词的文本

^((?!road)。*$
匹配不包含
road
的整个字符串。当在右边添加某些内容时,正则表达式将永远不会匹配任何内容,因为
$
是字符串的结尾。我认为您需要
^(?)。*Manchester\s+Road.*Manchester
,或者,在有单词边界的情况下,
^(?。*\bManchester\s+Road\b.*\bManchester\b
,类似于
新的正则表达式('^(?。..*'+req.query.search+'\\s+Road).'+req.query.search,'i')
@WiktorStribiżew感谢您的帮助。我添加了
new RegExp('^(?。*'+req.query.search+'\\s+Road)。*'+req.query.search,'I')
,但我的server.js失败,错误为'undefined'。我应该展示更多的代码。在任何更改之前,它目前正在工作:
const test=(req.query.search)?new RegExp('^(?!Manchester Road | Manchester Old Road)'+req.query.search,'i'):未定义
我认为它不应该是这样,为什么故意将RegExp对象设置为未定义?您需要使用不同的逻辑。听起来像NLP任务而不是正则表达式任务。。。如果用户写入
“曼彻斯特路”
,该怎么办?好的,把它也添加到正则表达式中。。。再加上所有可能的打字错误和一百万个边缘案例,你仍然会错过一些东西。。。