我在mongodb查询上有这个正则表达式,用于按前缀匹配单词:
{sentence: new RegExp('^'+key,'gi')}
如果我希望它匹配至少包含以key
前缀开头的单词的句子,那么正确的正则表达式模式是什么?例如:
如果我有一个句子
“这是一只狗”
当key
为'do'时,它应匹配该句子,因为前缀'do'是'dog'的子字符串。
我现在的解决方案仅适用于句子的第一个单词。如果我键入't'或'th'或'this',它到目前为止只匹配该句子。每当我输入'i'('is'的前缀)或'do'('dog'的前缀)时,它就不匹配该句子。
答案 0 :(得分:5)
答案 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