2012-06-11 3 views
0

Я пытаюсь реализовать границы слов в своей смайлике для чата. Но по какой-то причине я не могу заставить слова границы работать. Я новичок в регулярном выражении.Условные границы работают над символами?

Так что, когда я делаю:

var reg = /\b\Hi\b/gi; 
var str = 'HiHiHi Hi HiHiHi Hi'; 
alert(str.replace(reg, '')); 

Это происходит: Jsfiddle

Это на самом деле работает отлично, и делает удалить те 2 Привет о том, что стоят в одиночку.

Но когда я изменяю рег беглому смайлик, а затем изменить строку:

var reg = /\b\:\)\b/gi; 
var str = 'HiHi:) :) HiHiHi :)'; 
alert(str.replace(reg, '')); 

Это происходит: Jsfiddle

Это просто не работает. Строка остается неизменной. Нельзя ли использовать границы слов на символах? Если да, то как Facebook делает это в своих чатах?

+0

Пожалуйста, добавьте некоторые примеры того, что вы ** делать ** и ** не ** хочет, чтобы соответствовать. –

+0

Что вы подразумеваете под «Как это делает Facebook ...?» –

ответ

0

Как \b не будет работать в этом случае, вы можете использовать:

var re = /(\s|^):\)(?!\S)/g; 
var str = 'HiHi:) :) HiHiHi :)'; 
alert(str.replace(re, '$1')); 

Работает как космическая граница.

Вы можете добавить несколько смайликов к нему так:

/(\s|^)(?::\)|:\(|:\||:\]|:\[)(?!\S)/g; 
+0

@ Shawn31313, см. Обновление. Не забывайте избегать метасимволов. – Qtax

+0

Хорошо. Теперь, как бы добавить этот reg выше в новый объект JavaScript с RegExp()? – Shawn31313

+0

@ Shawn31313, исправить ошибки синтаксиса и удвоить escape-обратную косую черту при цитировании: http://jsfiddle.net/Bzqu8/5/ – Qtax

2

Граница слова \b представляют собой нулевую ширину границы между символами слова \w (в JavaScript, [A-Za-z_]) и символы несловообразующего \W (все остальные).

Из-за этого, не будет границей между двумя смайликами или когда смайлик окружен пробелами, знаками препинанием и т.д.

Самым простым регулярным выражением будет /[:;]-?[()]/gi, который поддерживает смайлики ) и frownies ( с дополнительным тире и глаза : или подмигивание ;.

Edit:

Это потребует либо пробел или начало строки (как группы захвата, поскольку Javascript не поддерживает просмотровых задом), то он использует выше регулярное выражение, то оно должно за которым следует конец строки или пробела.

var reg = /(\s|^)[:;]-?[()](?:\s|$)/gi; 
var str = 'HiHi:) :) HiHiHi :)'; 
alert(str.replace(reg, '$1')); 

Если заменить в этих ситуациях: :-), cool :(not!

Не следует заменить в этих ситуациях: Digits:(0,1,2,3), hi :(.

+1

Или проще: '\ w' и' \ W'. В то время как Javascript использует только ASCII, в общем, многие механизмы регулярных выражений имеют гораздо большие классы для '\ w'. – Joey

+0

Хорошая точка. Я включил ваше предложение. –

+0

Так что я не могу использовать границы слов для этого:/ – Shawn31313