Почему \ w соответствует только английским словам в регулярном выражении javascript? - PullRequest
8 голосов
/ 29 декабря 2008

Я пытаюсь найти URL-адреса в некотором тексте, используя код JavaScript. Проблема в том, что регулярное выражение, которое я использую, использует \ w для сопоставления букв и цифр внутри URL, но оно не соответствует неанглийским символам (в моем случае - буквам иврита).

Так что я могу использовать вместо \ w для сопоставления всех букв на всех языках?

Ответы [ 10 ]

17 голосов
/ 29 декабря 2008

Поскольку \w соответствует только символам ASCII 48-57 ('0' - '9'), 67-90 ('A' - 'Z') и 97-122 ('a' - 'z'). Символы иврита и другие специальные символы иностранного языка (например, умлаут-о или тильда-н) находятся за пределами этого диапазона.

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

6 голосов
/ 30 декабря 2008

Стандарт ECMA 262 v3, который определяет язык программирования, широко известный как JavaScript, предусматривает, что \w должен быть эквивалентен [a-zA-Z0-9_] и что \d должен быть эквивалентен [0-9 ]. \s, с другой стороны, соответствует пробелам ASCII и Unicode в соответствии со стандартом.

JavaScript также не поддерживает синтаксис \p для сопоставления Unicode-объектов, поэтому нет хорошего способа сделать это. Вы можете сопоставить все ивритские символы с:

[\u0590-\u05FF]

Это просто соответствует любой кодовой точке в блоке иврита.

Вы можете сопоставить любой символ слова ASCII или любой символ иврита с:

[\w\u0590-\u05FF]
5 голосов
/ 16 сентября 2010

Я думаю, что вы ищете это регулярное выражение:

^[אבגדהוזחטיכלמנסעפצקרשתץףןםa-zA-z0-9\s\.\-_\\\/]+$
3 голосов
/ 16 сентября 2011

Я только что нашел XRegExp , который еще не был упомянут, и я весьма впечатлен этим. Это альтернативная реализация регулярных выражений, имеет плагин Unicode и лицензируется по лицензии MIT.

Согласно веб-сайту, для сопоставления символов Юникода вы должны использовать такой код:

var unicodeWord = XRegExp("^\\p{L}+$");

unicodeWord.test("Русский"); // true
unicodeWord.test("日本語"); // true
unicodeWord.test("العربية"); // true
2 голосов
/ 26 апреля 2013

Попробуйте это \ p {L} регулярное выражение Юникода в буквы

1 голос
/ 30 декабря 2008

Обратите внимание, что URI (как расширенный набор URL-адресов) определяются W3C для разрешения только символов US-ASCII. Обычно все остальные символы должны быть представлены в процентах:

В местных или региональных контекстах и ​​с улучшая технологию, пользователи могут извлечь выгоду из возможности использовать более широкий диапазон символов; такое использование не определяется этой спецификацией. Процент-кодированные октеты (раздел 2.1) может использоваться в URI для представления символы за пределами диапазона Набор символов США-ASCII, если это представление допускается схема или элемент протокола в на который ссылается URI. Такой определение должно указывать кодировка символов используется для отображения тех символы в октеты до в процентах для URI. // URI: общий синтаксис

Что обычно происходит, когда вы открываете URL-адрес с не-ASCII-символами в браузере, они переводятся в нотацию% AB, которая, в свою очередь, означает US-ASCII.

Если возможно повлиять на способ создания материала, наилучшим вариантом будет подчинить URL-адреса функции типа urlencode () во время их создания.

1 голос
/ 29 декабря 2008

Проверьте это ТАК вопрос о JavaScript и Unicode out. Похоже, что ответ Яна Гойваэрта дает вам надежду.

Редактировать: Но тогда кажется, что все браузеры не поддерживают \ p ... в любом случае. Этот вопрос должен содержать полезную информацию.

1 голос
/ 29 декабря 2008

Посмотрите на http://www.regular -expressions.info / refunicode.html .

Похоже, что нет эквивалента \ w для Unicode, но вы можете сопоставить отдельные буквы Unicode, чтобы вы могли его создать.

0 голосов
/ 29 декабря 2008

Если вы генерируете URL-адреса с неанглийскими буквами, возможно, вы захотите пересмотреть.

Если я правильно интерпретирую W3C, URL-адреса могут содержать только символы слова в латинском алфавите .

0 голосов
/ 29 декабря 2008

Возможно \ S (без пробелов).

...