2012-03-06 2 views
2

Я пытаюсь использовать regExp javascript для соответствия полным словам, но это не работает, когда эти слова имеют знаки препинания в качестве границы. То естьJavascript RegExp: границы Word и знаки препинания

(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

+0

Извините, но я забыл включить это, но обновил код выше с этим сейчас. – LMH

+0

BTW: надежный, но чрезмерный RegExp.escape: 'replace (/ \ W/g, function (m) {var c = m.charCodeAt (0), r = c.toString (16); for (; c <4096 ; c << = 4) r = "0" + r; return "\\ u" + r;}); ' – kirilloid

ответ

1

является специальным символом для Regex. Я считаю, что вам нужно избегать этого.

3

? имеет особое значение в RegExp и должен быть экранирован.

ОК, я вижу, вы пытаетесь избежать этого ... но не у всех браузеров этот метод RegExp.escape был встроен, и казалось, что это проббет. Причина

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

работает как предполагается (верните истину).

Вот код, который я использовал:

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

А вы правы! Две проблемы теперь состоят в том, что он не будет соответствовать «\?» на "?" И его соответствие «почему бы и нет»? «почему бы и нет? sososo», которого это не должно быть. Есть идеи? – LMH

+1

* Как и планировалось * ;-) Знаки препинания не считаются границами слов. Вот как работает '\ b'. В первом случае это соответствует, потому что есть следующее слово сразу после '?'. Во втором случае нет слов и, следовательно, нет границ. Однако вы можете использовать '^ | \\ b ... $ | \\ b' вместо' \\ b ... \\ b' для второго случая. – kirilloid

+0

Спасибо! Я полагаю, что у вас нет блестящих мыслей о том, как совместить только однозначные знаки препинания? – LMH

Смежные вопросы