2012-03-06 59 views
2

我试图使用JavaScript的RegExp来匹配完整的单词,但它不起作用,当这些单词有标点符号作为边界。即Javascript RegExp:单词边界和标点符号

(new RegExp("\\b"+RegExp.escape("why not")+"\\b", 'i')).test("why not you foolish") 

正确匹配。并且:

(new RegExp("\\b"+RegExp.escape("why not")+"\\b", 'i')).test("why nots you foolish") 

正确地不匹配。问题是当这个词以“?”结尾时,这是行不通的:

(new RegExp("\\b"+RegExp.escape("why not?")+"\\b", 'i')).test("why not? you foolish") 

有什么建议吗?

注:我使用这个功能来逃避: “?”

# Escape characters for regexp 
RegExp.escape = (text) -> 
    text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") 
+0

是RegExp.escape东西,你已经在你自己定义的?因为RegExp没有方法'escape':[mdn](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp#Methods)如果是这样,你能告诉我们源代码,我们可以帮助你在那里发现问题。 – wave 2012-03-06 19:50:47

+0

对不起,我忘了包括,我现在更新了上面的代码。 – LMH 2012-03-06 20:11:48

+0

BTW:万无一失,但过多RegExp.escape:'替换(/ \ W/g,函数(m){var c = m.charCodeAt(0),r = c.toString(16); for(; c <4096 ; c << = 4)r =“0”+ r; return“\\ u”+ r;});' – kirilloid 2012-03-06 20:32:15

回答

1

是正则表达式的特殊字符。我相信你需要逃避它。

3

?在RegExp中有特殊含义,应该转义。

好吧,我明白了,你试图逃避它...但并非所有浏览器都有内置的这种方法RegExp.escape,它似乎是这个prolbem。原因

(new RegExp("\\b"+"why not\?"+"\\b", 'i')).test("why not? you foolish") 

按预期工作(返回true)。

下面是我使用的代码:

if (typeof RegExp.escape == "undefined") { 
    RegExp.escape = function(str) { 
     return str.replace(/([()\[\]\\\/+*?.-])/g, "\\$1"); 
    } 
} 
+0

啊,你是对的!现在的两个问题是它不会匹配“\?”至 ”?”与其匹配的“为什么不”?到“为什么不?sososo”它不应该。有任何想法吗? – LMH 2012-03-06 20:11:07

+1

*正如计划* ;-)标点符号不被视为词边界。这就是'\ b'的工作方式。在第一种情况下,它会匹配,导致在'?'后面有下一个单词。在第二种情况下,没有语言,因此没有边界。尽管如此,您可以使用'^ | \\ b ... $ | \\ b'而不是'\\ b ... \\ b'。 – kirilloid 2012-03-06 20:18:27

+0

谢谢!我不认为你对如何匹配单个标点符号有什么好的想法? – LMH 2012-03-06 20:42:50