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