Javascript 搜索一列与多个正则表达式中的任意一列匹配的任何项目

Javascript 搜索一列与多个正则表达式中的任意一列匹配的任何项目,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个非常具体的挑战,我似乎找不到答案,毕竟我的搜索。我想在MongoDB中搜索一篇文章,其中“content”列匹配多个可能的正则表达式中的任意一个 一般的想法是,我想输入一个单词,然后返回与该单词匹配的任何列以及带有任何后缀的单词。例如: 如果用户输入“建立”,我想搜索内容列包含以下任何内容的文章:“建立”、“建立”、“建立”、“建立”,等等 我可以生成可能的字符串列表来搜索我自己,但是如何使用MongoDB中的.find来搜索我的文章呢 我的代码目前看起来是这样的,搜索一个字符串效果很好

我有一个非常具体的挑战,我似乎找不到答案,毕竟我的搜索。我想在MongoDB中搜索一篇文章,其中“content”列匹配多个可能的正则表达式中的任意一个

一般的想法是,我想输入一个单词,然后返回与该单词匹配的任何列以及带有任何后缀的单词。例如:

如果用户输入“建立”,我想搜索内容列包含以下任何内容的文章:“建立”、“建立”、“建立”、“建立”,等等

我可以生成可能的字符串列表来搜索我自己,但是如何使用MongoDB中的.find来搜索我的文章呢

我的代码目前看起来是这样的,搜索一个字符串效果很好,我只需要搜索多个:

// get all articles with phrase = ?
router.get('/articlesByPhrase', async (req, res) => {
  const { person_id, phrase } = req.query;

  try {
    const articles = await Article.find({
      person_id,
      content: { $regex: phrase, $options: 'i' },
    })
    res.json(articles)
  } catch (err) {
    res.status(500).json({ message: err.message })
  }
})

我想我需要使用所有可能的字符串生成一个RegExp,但我不太确定如何实现。感谢您的帮助

如果单词的词根不会改变,并且您确切地知道要查找什么后缀,那么根据您给出的示例,您可以使用如下所示的regexpr:

"establish(?:ment|es|ed)?\b"
在上面的字符串中,表达式
(?:)
称为非捕获组。它用于匹配一组字符(例如,在执行替换时,无需重新引用它们)。在该组中,您可以指定要匹配的多个选项,并使用分隔符
|
拆分这些选项

末尾的
指定要匹配前面元素的0或1。最后,
\b
匹配一个单词分隔符(空格、标点符号等)

请记住,您形成的任何正则表达式字符串都必须提供给Regexpr构造函数,因此您需要注意正确转义字符(这里是一个示例)。这使得:

var regex_string = 'establish\(\?:ment\|es\|ed\)\?\\b'
Javascript通过使用
String.raw
,有一种简便的解决方法:

const regexString = String.raw`establish(?:ment|es|ed)?\b`

谢谢大家的帮助。我基本上用的是阿里·道威尔的答案。但我的结局是:

// get all articles with phrase = ?
router.get('/articlesByPhrase', async (req, res) => {
  const { person_id, phrase, all_forms } = req.query;
  var regExp;
  if (all_forms === 'true') {
    const { suffixes } = forms;
    const suffixInserts = suffixes.join('|');
    regExp = String.raw`${phrase}(?:${suffixInserts})?\b`
  } else {
    regExp = String.raw`${phrase}\b`
  }
  try {
    console.log(`searching with :${regExp}`)
    const articles = await Article.find({
      person_id,
      content: { $regex: regExp, $options: 'gi' },
    })
    res.json(articles)
  } catch (err) {
    res.status(500).json({ message: err.message })
  }
})

不。。。你自己试过了吗?您正在使用,但已接近。仍然没有。。。由于regex模式是以字符串形式编写的,因此需要将其提供给
RegExp
构造函数,因此它需要更多的转义。你还是没有尝试。。。。哦,老兄。。。在你发布代码之前,你真的试过自己吗
var regex|u string=string.raw('build(?:ment|es|ed)?\b')
。。。立即失败。。。它必须是
const regexString=String.raw`build(?:ments | es | ed)?\b`
请原谅,我从未使用过Javascript,所以我试图脱离参考。谢谢你的耐心和帮助!非常感谢。这对你们两个都非常有帮助。我将公布我最终所做的事情。是否所有已知的
建立
可以成功的案例?或者在这个词结束之前允许做任何事情吗?有很多不同的解决方案。只要不确切地知道用例及其条件/规范,像
/^build/
(regex形式的
.startsWith('build')
)这样简单的东西可能已经足够了。那么,字符串看起来如何“…只需搜索多个”