Javascript中的RegExp允许部分字符串匹配';曼彻斯特';但不匹配';曼彻斯特路';
我想在我的网络表单中搜索“曼彻斯特”,它搜索我的mongoDB。我不想要街道或道路或任何包含曼彻斯特的东西,例如“戈德曼彻斯特”。我只想要城市/字符串“Manchest”或类似“Manchest”或“Manchester”的部分,这样我就可以发现拼写错误。 在我开始之前,我得到的答案像是“戈德曼彻斯特”和“曼彻斯特路”以及正确的“曼彻斯特”。 我通过在RegExp中使用“^”成功地摆脱了“godmachester”匹配。 然后,我使用以下RegExp语句成功地摆脱了“曼彻斯特路”:Javascript中的RegExp允许部分字符串匹配';曼彻斯特';但不匹配';曼彻斯特路';,javascript,regex,Javascript,Regex,我想在我的网络表单中搜索“曼彻斯特”,它搜索我的mongoDB。我不想要街道或道路或任何包含曼彻斯特的东西,例如“戈德曼彻斯特”。我只想要城市/字符串“Manchest”或类似“Manchest”或“Manchester”的部分,这样我就可以发现拼写错误。 在我开始之前,我得到的答案像是“戈德曼彻斯特”和“曼彻斯特路”以及正确的“曼彻斯特”。 我通过在RegExp中使用“^”成功地摆脱了“godmachester”匹配。 然后,我使用以下RegExp语句成功地摆脱了“曼彻斯特路”: new Re
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
详细信息
-字符串的开头^
-如果曼彻斯特是一个完整的单词,则匹配失败,然后是可选的1+空格和(?!.*\b曼彻斯特(?:\s+Old)?\s+Road\b)
,然后是1+空格和Old
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任务而不是正则表达式任务。。。如果用户写入“曼彻斯特路”
,该怎么办?好的,把它也添加到正则表达式中。。。再加上所有可能的打字错误和一百万个边缘案例,你仍然会错过一些东西。。。