2012-03-06 6 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にはメソッド「エスケープ」はありません。[mdn](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/RegExp#Methods)もしそうなら、ソースを表示して助けてくれますかあなたはそこで問題を見つけます。 – wave

+0

申し訳ありませんが、私はそれを含めるのを忘れてしまったので、私は上記のコードを更新しました。 – LMH

+0

BTW:大丈夫ですが、余計ですRegExp.escape:for(; c <4096(for); for(&c); for ; c << = 4)r = "0" + r; "\\ u" + r;}); ' – kirilloid

答えて

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

あなたは正しいです!今、2つの問題は、それは一致しないということです "\?" 〜に?それと一致する "なぜではない?"それはすべきではありませんか?何か案は? – LMH

+1

*計画どおり* ;-)句読点は単語境界と見なされません。それが '\ b'の仕組みです。最初に一致すると、 '?'の直後に次の単語があるためです。 2番目のケースでは、言葉がないので境界がありません。しかし、\\ b ... \\ b'の代わりに '^ | \\ b ... $ | \\ b'を使用することもできます。 – kirilloid

+0

ありがとう!私はちょうどhte単一の句読点にも一致する方法についてどのような素晴らしい考えを持っているとは思わない? – LMH

関連する問題