【问题标题】:Regex to match words in a sentence by its prefix正则表达式通过前缀匹配句子中的单词
【发布时间】:2012-02-21 13:19:23
【问题描述】:

我在 mongodb 查询上有这个正则表达式来按前缀匹配单词:

{sentence: new RegExp('^'+key,'gi')}

如果我希望它匹配至少有一个以key 前缀开头的单词的句子,那么正确的正则表达式模式是什么?例如:

如果我有一句话

“这是一条狗”

key 是'do' 时,它应该匹配那个句子,因为前缀'do' 是'dog' 的子串。

到目前为止,我的解决方案仅适用于句子的第一个单词。到目前为止,如果我输入“t”或“th”或“this”,它只会匹配该句子。每当我输入“i”(“is”的前缀)或“do”(“dog”的前缀)时,它都不会匹配该句子。

【问题讨论】:

    标签: javascript regex mongodb


    【解决方案1】:

    您可以使用表达式/\bprefix\w+/。这应该匹配以"prefix" 开头的任何单词。这里\b 代表一个单词边界,\w 是任何单词字符。

    如果您不想了解全部内容,您可以使用/\bprefix/。如果你想把它放在一个字符串中,你还必须转义\'\\bprefix'

    【讨论】:

    • 您需要\w+ 后面的\b 吗?当然,单词边界不是单词字符...
    【解决方案2】:

    使用\b anchor 匹配单词边界:

    \bdo
    

    在“nice dog”中找到“do”,但与“much ado about nothing”不匹配。

    【讨论】:

    • 如果你真的要将它放在一个字符串中(而不是正则表达式文字),你应该转义反斜杠:'\\bdo'
    • 感谢您的帮助。我赞成所有答案,因为它们都是正确的。我不知道该接受哪一个,所以我最早的去:)
    【解决方案3】:

    建议单词边界匹配的其他答案很简洁,但意味着索引没有得到有效使用。如果您需要快速查找,您可能需要考虑添加一个字段“单词”,每个单词都被分解,即

    {sentence: "This is a dog",
      words: ["This", "is", "a", "dog"]}
    

    words字段上放置索引后,您可以返回使用:

    {words: new RegExp('^'+key,'gi')}
    

    “do”的key 现在将匹配此对象使用索引。

    【讨论】:

      【解决方案4】:

      ^ 匹配字符串的开头(如果设置了多行标志,则匹配行的开头)。

      \b 匹配单词边界。

      \bdo 匹配以“do”开头的单词。

      所以对于你的例子:

      {sentence: new RegExp('\\b'+key,'gi')}
      

      (请注意,在 JavaScript 字符串中,您必须转义反斜杠。)

      如果您需要捕获匹配项以找出与模式匹配的单词,您需要将表达式括在括号中并添加一点以匹配单词的其余部分:

      new RegExp('(\\b' + key + '\\w*)','gi')
      

      其中\w 是任何单词字符,* 是零个或多个。如果您想要至少比key 多一个字符的单词,请使用+ 而不是*

      有关更多详细信息,请参阅网络上的许多正则表达式指南,例如,https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

      【讨论】:

        猜你喜欢
        • 2013-08-26
        • 2010-12-29
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        相关资源
        最近更新 更多