2012-01-29 51 views
3

我对MongoDB的查询此正则表达式由前缀匹配的话:正则表达式通过其前缀匹配的一句话

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

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

如果我有一句话

“这是一只狗”

key是“不”,那么它应该匹配,因为前缀“做”那句话是'狗'的子串。

我以现在的解决方案仅适用于该句子的第一个字。如果我输入“t”或“th”或“this”,它到目前为止只匹配该句子。只要我输入'i'('is'的前缀)或'do'(前缀为'dog'),它就不会匹配那句话。

回答

5

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

\bdo 

的发现在“好狗”做',但不匹配“无事生非”。

+5

如果你真的要把它放在一个字符串中(而不是正则表达式),你应该避开反斜杠:''\\ bdo''。 – 2012-01-29 09:25:03

+0

好点,谢谢 – wutz 2012-01-29 09:25:58

+0

感谢您的帮助。我提出了所有的答案,因为他们都是正确的。我不知道哪一个可以接受,所以我最早去:) – 2012-01-29 09:42:43

4

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

如果你不想得到整个单词,你可以做/\bprefix/。如果你想把它放在一个字符串中,你也必须逃避\'\\bprefix'

+1

'\ w +'之后需要'\ b'吗?当然,单词边界不是一个单词字符... – nnnnnn 2012-01-29 09:32:48

+0

@nnnnnn是的,你说得对。 – 2012-01-29 09:33:23

1

^比赛开始的字符串(或开始处的线的,如果多标志被设置)。

\b单词边界匹配。

\bdo匹配与 “做” 开头的单词。

因此,对于你的例子:

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

(注意到在JavaScript字符串,你必须逃离反斜杠。)

如果你也将需要捕捉匹配(ES)找出什么字(S)匹配你想要包装的括号中的表达,并添加了一下这个词的其余部分匹配的模式:

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

\w任何WOR d字符和*为零或更多。如果您想要的单词至少有一个字符多于key,则使用+而不是*

请参阅Web上的许多正则表达式指南了解更多详情,例如,https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

2

建议词边界匹配的其他答案是整齐的,但这意味着索引不能有效使用。如果您需要快速查找,您可能要考虑增加一个字段“字”与你的每一个字分解,即

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

把一个指标上words场后,你可以回去使用:

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

和“做”,现在将匹配这个对象使用索引的key