Почему это регулярное выражение не работает для немецких слов? - PullRequest
12 голосов
/ 28 октября 2010

Я пытаюсь разбить следующее предложение словами и обернуть их в промежуток.

<p class="german_p big">Das ist ein schönes Armband</p>

Я следовал этому: Как получить слово под курсором с помощью JavaScript?

$('p').each(function() {
            var $this = $(this);
            $this.html($this.text().replace(/\b(\w+)\b/g, "<span>$1</span>"));
        });

Единственная проблема, с которой я сталкиваюсь, заключается в том, что после переноса слов в span результирующий HTML выглядит следующим образом:

<p class="german_p big"><span>Das</span> <span>ist</span> <span>ein</span> <span>sch</span>ö<span>nes</span> <span>Armband</span>.</p>

Итак, schönes разбит на три слова sch, ö и nes. почему это происходит? Что может быть правильным регулярным выражением для этого?

Ответы [ 8 ]

26 голосов
/ 28 октября 2010

Unicode в Javascript Regexen

Как и сама Java, Javascript не поддерживает Unicode в своих \w, \d и \b регулярных выражениях regex.Это (возможно) ошибка в Java и Javascript.Даже если из-за казуистики или упрямства удается утверждать, что это , а не ошибка, это, безусловно, большая ошибка.Что-то вроде укусов.

Проблема заключается в том, что эти популярные ярлыки регулярных выражений только применяются к 7-битному ASCII как в Java, так и в Javascript.Это ограничение мучительно 1970-х годов;это не имеет абсолютно никакого смысла в 21 веке.Это сообщение в блоге , сделанное в марте этого года, дает хороший аргумент для исправления этой проблемы в Javascript.

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

Эта страница говорит о том, что Javascript вообще не поддерживает свойства Юникода.На этом же сайте есть таблица , что намного более подробно, чем страница Википедии, о которой я упоминал выше.Для функций Javascript, посмотрите под его столбцом ECMA.

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

Поддержка Unicode на других языках

Ruby, Python, Perl и PCRE предлагают способы расширения \w до значения, которое предполагается значить, но две J-вещицы не имеют.

В Java, однако, - это хороший обходной путь.Там вы можете использовать \pL для обозначения любого символа, который имеет свойство Unicode General_Category = Letter.Это означает, что вы всегда можете эмулировать правильное значение \w, используя [\pL\p{Nd}_].

Действительно, даже писать его таким образом есть преимущество, потому что оно информирует вас о том, что вы добавляете десятичные числа и символ подчеркивания.в класс персонажа.С простым \w, пожалуйста, иногда забывайте, что это происходит.

Я не верю, что этот обходной путь доступен в Javascript, хотя.Вы также можете использовать свойства Unicode, такие как в Perl и PCRE, а также в Ruby 1.9, но не в Python.

Единственные свойства Unicode, которые в настоящее время поддерживает Java, - это одно- и двухсимвольные общие свойства, такие как \pN и \p{Lu}, и свойства блока, такие как \p{InAncientSymbols}, но не сценарии, такие как \p{IsGreek} и т. Д.

Будущий JDK7 наконец-то найдет способ добавить скрипты.Даже тогда Java по-прежнему не будет поддерживать большинство свойств Unicode, хотя даже не критичные, такие как \p{WhiteSpace} или удобные, такие как \p{Dash} и \p{Quotation_Mark}.

SIGH! Чтобы понять, насколько ограничена поддержка свойств Java, просто сравните ее с Perl.Perl поддерживает 1633 свойства Unicode начиная с выпуска 5.10 2007 года, и 2478 из них начиная с выпуска 5.12 этого года.Я не считал их для древних выпусков, но Perl начал поддерживать свойства Unicode еще в прошлом тысячелетии.

Хромый, как Java, он все же лучше, чем Javascript, потому что Javascript не поддерживает никаких свойств Unicode, поэтому CENSORED никогда.Боюсь, что мрачное 7-битное мышление Javascript делает его практически непригодным для Unicode.Это чрезвычайно большая зияющая дыра в языке, которую чрезвычайно трудно объяснить, учитывая ее целевой домен.

Извините, но об этом.☹

10 голосов
/ 14 ноября 2014

Чтобы включить все латинские 1 дополнительные символы, такие как äöüßÒÿ, вы можете использовать:

[\w\u00C0-\u00ff]

однако в латинском Extended-A и Latin Extended- есть еще больше забавных символовВ Unicode блоки, как ČŇů.Чтобы включить это вы можете использовать:

[\w\u00C0-\u024f]
10 голосов
/ 28 октября 2010

\w соответствует только A-Z, a-z, 0-9 и _ (подчеркивание).

Вы можете использовать что-то вроде \S+, чтобы соответствовать всем непробельным символам, включая символы не ASCII, такие как ö. Это может или не может работать в зависимости от того, как отформатирована остальная часть вашей строки.

Ссылка: http://www.javascriptkit.com/javatutors/redev2.shtml

9 голосов
/ 28 октября 2010

Вы также можете использовать

/\b([äöüÄÖÜß\w]+)\b/g

вместо

/\b(\w+)\b/g

для обработки умлаутов

6 голосов
/ 28 октября 2010

\w и \b не поддерживают Unicode в javascript; они соответствуют только ASCII-словам / граничным символам. Если вы используете варианты, все позволят разбивать пробелы, вы можете использовать \s / \S, которые поддерживают Unicode.

2 голосов
/ 28 октября 2010

Как отмечают другие, ярлык \ w не очень полезен для нелатинских наборов символов. Если вам нужно сопоставить другие текстовые диапазоны, вы должны использовать шестнадцатеричное обозначение * ( Ref1 ) ( Ref2 ) для соответствующего диапазона.

* может быть шестнадцатеричным, восьмеричным или юникодным, вы часто будете видеть их вместе как шестнадцатеричное обозначение .

1 голос
/ 08 сентября 2011

\ b также не будут работать правильно.Можно использовать тег \ p {L} библиотеки Xregex для поддержки юникода, однако поддержка \ b по-прежнему отсутствует, поэтому вы не сможете найти границы слова.Было бы неплохо обеспечить поддержку \ b, выполнив lookbehind / lookaheads с \ P {L} в следующей реализации

http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

0 голосов
/ 06 декабря 2014

Хотя javascript не поддерживает Unicode изначально, вы можете использовать эту библиотеку для его обхода:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...