2016-07-15 5 views
0

Я пытался создать регулярное выражение, которое заменит слово, которое может содержать или не содержать символы акцента. Я изучал это в течение последних двух дней, но не могу найти информацию, необходимую мне для решения моей проблемы.Повторное выражение Javascript для замены слова, которое может содержать символы акцента

Я придумал простые регулярные выражения, который обрабатывает слова без ударения символов больших:

var re = new RegExp('(?:\\b)hello(?:\\b)', 'gm'); 
var string = 'hello hello hello world hellos hello'; 
string.replace(re, "FOO"); 

Результат: FOO FOO FOO world hellos FOO

Вышеуказанных работ, как я хочу. Проблема с приведенным выше кодом заключается в том, когда слово содержит символ акцента в качестве первого или последнего символа в строке. Пример:

var re = new RegExp('(?:\\b)helló(?:\\b)', 'gm'); 
var string = 'helló helló helló world hellós helló'; 
string.replace(re, "FOO"); 

Результат: helló helló helló world FOOs helló

Желаемый результат: FOO FOO FOO world hellós FOO

Из моего понимания, выше происходит потому, акцентированный характер интерпретируется как граница. Моя попытка решить эту проблему (обратите внимание: диапазон [A-zÀ-ÿ] является то, что я считаю, что правильный алфавит, чтобы построить слово):

var re = new RegExp('([^A-zÀ-ÿ]|^)helló([^A-zÀ-ÿ]|$)', 'gm'); 
var string = 'helló helló helló world hellós helló'; 
string.replace(re, "$1FOO$2"); 

Результат: FOO helló FOO world hellós FOO

Как вы можете видеть, я гораздо ближе к желаемый результат. Однако проблема возникает, когда рассматриваемое слово появляется три или более раза подряд. Обратите внимание, что второе появление helló было проигнорировано. Я считаю, что это связано с тем, что предшествующее им пробелы уже было сопоставлено с первым вхождением helló.

Есть ли у кого-нибудь какие-либо предложения о том, как достичь FOO FOO FOO world hellós FOO?

+0

Скорее всего, дубликат http://stackoverflow.com/questions/5436824/matching-accented-characters-with-javascript-regexes, но я не использую hamer до тех пор, пока не подтвержутся – mplungjan

+0

Можете ли вы точно объяснить, что требования для сопоставляя слово? Он заменяется для любого экземпляра в любом месте строки или в определенном месте. Поэтому вместо этого регулярного выражения почему бы не «hello \ B'? – 10100111001

ответ

2

Ответ немного сложно, но был дан ответ в следующем, почему вы боретесь по этому вопросу: Why can't I use accented characters next to a word boundary?

Однако, учитывая отсутствие хорошей поддержки юникода в Javascript, особенно перед ECMAScript 6 (У меня была эта проблема в прошлом). Я обнаружил, что часто лучше использовать стороннюю библиотеку с лучшей поддержкой юникода, например: http://xregexp.com/

Это также устраняет некоторые отклонения от поддержки старых браузеров.