正则表达式通过其前缀匹配句子中的单词

时间:2012-01-29 09:20:41

标签: javascript regex mongodb

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

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

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

如果我有一个句子

  

“这是一只狗”

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

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

4 个答案:

答案 0 :(得分:5)

使用\b anchor匹配字边界:

\bdo

在'好狗'中找到'做',但不匹配'多无所谓'。

答案 1 :(得分:4)

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

如果你不想说全文,你可以/\bprefix/。如果你想把它放在一个字符串中,你还必须逃避\'\\bprefix'

答案 2 :(得分:2)

其他答案表明单词边界匹配是整齐的,但意味着索引不能有效使用。如果您需要快速查找,您可能需要考虑在每个单词中添加字段“单词”,即

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

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

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

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

答案 3 :(得分:1)

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

\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