Почему \w соответствует только английским словам в регулярном выражении javascript?

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

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


person Doron Yaacoby    schedule 29.12.2008    source источник


Ответы (10)


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

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

person David Koelle    schedule 29.12.2008
comment
Спасибо, для внутренних частей URL я сопоставил все, кроме пробела, '.' и '/'. Что-нибудь еще, что я мог пропустить? - person Doron Yaacoby; 29.12.2008
comment
Возможно, двоеточие ':', которое можно использовать для отделения URL-адреса от номера порта. - person David Koelle; 29.12.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]
person Jan Goyvaerts    schedule 30.12.2008

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

^[אבגדהוזחטיכלמנסעפצקרשתץףןםa-zA-z0-9\s\.\-_\\\/]+$
person lani    schedule 16.09.2010
comment
Добро пожаловать в Stack Overflow. Я никогда не пробовал, но א-ת тоже может работать, даже включая последние буквы - en.wikipedia.org/wiki /Unicode_and_HTML_for_the_Hebrew_alphabet . - person Kobi; 16.09.2010

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

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

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

unicodeWord.test("Русский"); // true
unicodeWord.test("日本語"); // true
unicodeWord.test("العربية"); // true
person Rbjz    schedule 16.09.2011
comment
Я только что интегрировал этот инструмент в наш проект, и он работает хорошо. - person Rbjz; 16.09.2011

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

person Marcelo Rodovalho    schedule 26.04.2013

Взгляните на http://www.regular-expressions.info/refunicode.html.

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

person Toon Krijthe    schedule 29.12.2008
comment
На этой странице есть более подробное объяснение и список шаблонов символов: regular-expressions.info/unicode.html. - person enobrev; 29.12.2008

Проверьте этот вопрос SO о JavaScript и Unicode. Похоже, что ответ Яна Гойвертса дает вам некоторую надежду.

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

person PEZ    schedule 29.12.2008
comment
Очень жаль. \p было бы именно то, что доктор прописал. - person PEZ; 30.12.2008

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

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

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

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

person Gnudiff    schedule 30.12.2008

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

person chaos    schedule 29.12.2008

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

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

person Triptych    schedule 29.12.2008
comment
К сожалению, я не могу контролировать создание URL-адресов, и они почти всегда будут содержать символы иврита. - person Doron Yaacoby; 30.12.2008
comment
Это неправда - допускаются и русские символы, а также другие символы из других алфавитов. - person VMAtm; 19.04.2011