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

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

<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>"));
        });

Единственная проблема, с которой я столкнулся, заключается в том, что после обертывания слов в промежутке результирующий 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. почему это происходит? Что может быть правильным регулярным выражением для этого?

Ответ 1

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

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

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

Ответ 2

Юникод в Javascript Regexen

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

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

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

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

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

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

Ruby, Python, Perl и PCRE предлагают способы расширения \w для обозначения того, что это означает, но у двух J-thingies нет.

В 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-свойства с выпуском 2007 года 5.10 и 2478 из них с выпуском 5.12 этого года. Я не учитывал их для древних релизов, но Perl начал поддерживать свойства Unicode еще в течение последнего тысячелетия.

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

Извини, что. ☹

Ответ 3

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

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

вместо

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

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

Ответ 4

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

[\w\u00C0-\u00ff]

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

[\w\u00C0-\u024f]

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

В то время как javascript не поддерживает Unicode изначально, вы можете использовать эту библиотеку для ее работы: http://xregexp.com/