От Фин Дженсен
23 января 2018 г.
Случайная прогулка по миру Юникода и регулярных выражений Фото Президио Монтерея
Символьные классы в регулярных выражениях являются чрезвычайно полезной и широко распространенной функцией, но есть некоторые относительно недавние изменения, о которых вы можете не знать.
Проблема связана с тем, как разные языки программирования, локали и кодировки символов обрабатывают предопределенные классы символов. Возьмем, к примеру, выражение \ w, которое было введено в Perl примерно в 1990 году (вместе с \ d и \ s и их инвертированными наборами \ W, \ D и \ S).
Сокращение \ w - это класс символов, который соответствует «символам слова» в понимании языка C: [a-zA-Z0-9_]. По крайней мере, когда ASCII был основным игроком на сцене кодирования символов, этот простой факт был правдой. С стандартизацией Unicode и UTF-8 значение \ w стало более туманным.
Perl
Возьмите этот пример в недавней версии Perl:
используйте 5.012; # использование 5.012 или выше включает поддержку Юникода use utf8; # необходимо для строковых литералов Unicode print "username" = ~ / ^ \ w + $ /; # 1 напечатать "user اسم" = ~ / ^ \ w + $ /; № 1Perl трактует \ w здесь по-другому, потому что символы «اسم» («ism» означает «имя» на арабском языке) определенно не попадают в [a-zA-Z0-9_]!
Начиная с Perl 5.12 с 2010 года, классы персонажей обрабатываются по-разному. Документация по теме находится в perlrecharclass , Правила не так просты, как в некоторых языках, но могут быть обобщены следующим образом:
\ w будет сопоставлять символы Юникода со свойством «Word» (эквивалентно \ p {Word}), если не включен флаг / a (ASCII), в этом случае он будет эквивалентен оригинальному [a-zA-Z0- 9_].
Давайте посмотрим / флаг в действии.
используйте 5.012; используйте utf8; print "username" = ~ / ^ \ w + $ / a; # 1 print "user اسم" = ~ / ^ \ w + $ / a; № 0Однако вы должны знать, что для кодовых точек ниже 256 эти правила могут изменяться в зависимости от того, включены ли правила Unicode или локали, поэтому, если вы не уверены, обратитесь к perlre а также perlrecharclass ,
Имейте в виду, что эти же вопросы о том, что включают в себя классы символов, могут применяться ко всем предопределенным классам символов на любом языке, который вы используете, поэтому не забывайте проверять реализации для конкретного языка для других сокращений классов символов, таких как \ s и \ d, не только \ w.
Кажется, что каждый язык выполняет регулярные выражения немного по-своему, поэтому вот краткое, неполное руководство для некоторых других языков, которые мы часто используем.
питон
Возьмите этот пример в Python 3.6.2:
>>> re.match (r '^ \ w + $', 'username') <_sre.SRE_Match object; span = (0, 8), match = 'username'> >>> re.match (r '^ \ w + $', 'user اسم') <_sre.SRE_Match object; span = (0, 7), match = 'user اسم'>Python также трактует \ w по-другому здесь. Давайте посмотрим на документы по Python :
\ ш
Для шаблонов Unicode (str):
Соответствует символам Unicode; это включает в себя большинство символов, которые могут быть частью слова на любом языке, а также цифры и подчеркивание. Если используется флаг ASCII, сопоставляется только [a-zA-Z0-9_] (но флаг влияет на все регулярное выражение, поэтому в таких случаях использование явного [a-zA-Z0-9_] может быть лучшим выбором ).
Для 8-битных (байтовых) шаблонов:
Соответствует символам, которые считаются буквенно-цифровыми в наборе символов ASCII; это эквивалентно [a-zA-Z0-9_]. Если используется флаг LOCALE, сопоставляет символы, которые считаются буквенно-цифровыми в текущей локали и подчеркивании.
Таким образом, \ w включает «большинство символов, которые могут быть частью слова на любом языке, а также цифры и подчеркивание». Список символов, который включает в себя, сложно закрепить, поэтому лучше использовать флаг re.ASCII, как предлагается, когда вы не уверены, хотите ли вы, чтобы буквы из других языков соответствовали:
>>> re.match (r '^ \ w + $', 'user اسم', flags = re.ASCII) >>> re.match (r '^ \ w + $', 'username', flags = re.ASCII) <_sre.SRE_Match object; span = (0, 8), match = 'username'>Рубин
Руби Класс регулярных выражений Документация дает простое и полезное объяснение: классы символов с обратной косой чертой (например, \ w, \ s, \ d) предназначены только для ASCII, в то время как выражения скобок в стиле POSIX (например, [[: alnum:]]) включают другие символы Unicode.
irb (основной): 001: 0> / ^ \ w + $ / = ~ "user اسم" => nil irb (основной): 002: 0> / ^ [[: word:]] + $ / = ~ "user اسم" = > 0JavaScript
JavaScript не поддерживает скобочные выражения в стиле POSIX, а его классы символов с обратной косой чертой представляют собой простые, простые списки символов ASCII. MDN имеет простые объяснения для каждого.
Регулярные выражения JavaScript принимают флаг / u, но он не влияет на классы сокращенных символов. Рассмотрим эти примеры в Node.js:
> /^\w+$/.test("username "); true> /^\w+$/.test("user ﺎﺴﻣ "); false> /^\w+$/u.test("username "); true> /^\w+$/u.test("user ﺎﺴﻣ "); ложныйМы видим, что флаг / u не влияет на совпадения \ w. Теперь давайте посмотрим на длину символов Unicode в JavaScript:
> '❤'.length 1>' 👩'.length 2> '🀄️'.length 3Из-за способа реализации Unicode в JavaScript строки с символами Unicode вне BMP (базовой многоязычной плоскости) будут выглядеть длиннее, чем они есть.
Это может быть учтено в регулярных выражениях с флагом / u, который исправляет только разбор символов и не влияет на классы сокращенных символов:
> let mystr = "hi👩there"; undefined> mystr.length 9> /hi.there/.test(mystr); false> /hi..there/.test(mystr); true> /hi.there/u.test(mystr); # запишите / u отсюда на true> /hi..there/u.test(mystr); false> /hi..there/u.test("hi👩👩there "); правдаОтличная статья "💩". Длина === 2 Джонатан Нью подробно рассказывает о том, почему это так, и исследует различные решения. Это также устраняет некоторые устаревшие несоответствия, например, как старый символ HEAVY BLACK HEART и другие более старые символы Unicode могут быть представлены по-разному.
PHP
Документация PHP объясняет, что \ w соответствует буквам, цифрам и подчеркиванию, как определено вашей локалью. Не совсем понятно, как обрабатывается Unicode, но она использует библиотеку PCRE (Perl-совместимые регулярные выражения), которая поддерживает флаг / u, который можно использовать для включения сопоставления Unicode в классах символов:
<? php echo preg_match ("/ ^ \\ w + $ /", "username"), "\ n"; # 1 echo preg_match ("/ ^ \\ w + $ /", "user اسم"), "\ n"; # 0 echo preg_match ("/ ^ \\ w + $ / u", "username"), "\ n"; # 1 echo preg_match ("/ ^ \\ w + $ / u", "user اسم"), "\ n"; № 1.СЕТЬ
Краткий справочник по .NET имеет исчерпывающее руководство по классам персонажей. Для символов слова он определяет определенную группу категорий Unicode, включая буквы, модификаторы и коннекторы из многих языков, но также указывает, что установка ECMAScript Соответствие поведения опция ограничит \ w [a-zA-Z_0-9], между прочим. Документация Microsoft ясна и полна, с отличными примерами, поэтому я рекомендую часто ссылаться на нее.
Идти
Go следует синтаксису регулярного выражения, используемому Google RE2 Engine , который имеет простой синтаксис для указания, хотите ли вы, чтобы символы Unicode были захвачены или нет:
импорт основного пакета ("fmt" "regexp") func main () {// fmt.Println в стиле Perl (regexp.MatchString (`^ \ w + $`, "username")) // true fmt.Println (regexp. MatchString (`^ \ w + $`, "user اسم")) // false // POSIX-стиль fmt.Println (regexp.MatchString (`^ [[: word:]] + $`, "username")) // true fmt.Println (regexp.MatchString (`^ [[: word:]] + $`, "user اسم")) // false // Класс символов Unicode fmt.Println (regexp.MatchString (`^ \ pL + $`, "username")) // true fmt.Println (regexp.MatchString (`^ \ pL + $`, "user اسم")) // true}Вы можете увидеть этот код в действии Вот ,
Grep
Реализации grep широко варьируются в зависимости от платформы и версии. На моем персональном компьютере с GNU grep 3.1 \ w вообще не работает с настройками по умолчанию, сопоставляет только символы ASCII с опцией -P (PCRE) и сопоставляет символы Unicode с -E:
[phin @ caballero ~] $ grep "^ \ w + $" <(echo "username") # нет совпадения [phin @ caballero ~] $ grep -P "^ \ w + $" <(echo "username") username [phin @caballero ~] $ grep -P "^ \ w + $" <(echo "user اسم") # нет совпадения [phin @ caballero ~] $ grep -E "^ \ w + $" <(echo "username") username [phin @caballero ~] $ grep -E "^ \ w + $" <(echo "user اسم") user اسمОпять же, реализации сильно различаются, поэтому дважды проверьте свою систему, прежде чем делать что-то важное.
Другие ссылки
Как бы ни были хороши Юникод и регулярные выражения, их реализации сильно различаются в разных языках и инструментах, что приводит к гораздо более неожиданному поведению, чем я могу написать в этом посте. Всякий раз, когда вы собираетесь использовать что-то с Юникодом и регулярными выражениями, обязательно проверьте языковые спецификации, чтобы убедиться, что все будет работать так, как ожидается.
Конечно, эта тема уже обсуждалась и писалась достаточно подробно. Вот некоторые ссылки, которые стоит проверить:
питон Рубин Javascript golang Perl DotNet PHP юникода
Похожие
3 черты, характеризующие хорошую ссылкуПолучение ценных ссылок на сайт в настоящее время является одним из наиболее эффективных способов поддержки действий, направленных на позиционирование сайта в поисковой системе. Однако за последние годы многое изменилось в этом вопросе. Прежде всего, вы должны забыть о получении ссылок на сайт из так называемых ссылочных ферм, поскольку это может привести к совершенно другому результату, чем предполагалось. Как и в случае оптимизации веб-сайта, теперь важнее качество ссылок, Загрузить автономные установщики Avast 2015 R2 (прямые ссылки для загрузки)
Как Facebook влияет на позиционирование?
В последнее время много было слышно о влиянии социального Медиа для позиционирования. Это правда об интеграции стратегии социальных сетей с SEO Я слышал уже в 2008-2009 годах, когда на зарубежных форумах и порталах мы читали о получении ссылок из социальных сетей . В то время в Польше социальные сети редко рассматривались как ссылки. Мы использовали совершенно ... идти не так. Имея это в виду, наиболее беспроблемным вариантом был Appear.in , который позволил мне сразу войти и...
... идти не так. Имея это в виду, наиболее беспроблемным вариантом был Appear.in , который позволил мне сразу войти и начать общаться. GoToMeeting был легко худшим и запутанным опытом, и мне пришлось загрузить одно расширение Chrome, одно настольное приложение и не знать, была ли активна моя веб-камера и совместное использование экрана. Чтобы найти баланс между функциями и удобством использования, я бы порекомендовал Как сделать рекламный баннер в фотошопе
Это руководство о том, как использовать изображения вашего продукта для создания баннерной рекламы в Photoshop. После того, как вы создадите баннер в Photoshop, вы можете менять изображения и текст по мере необходимости для будущих баннеров. Этот блог показывает вам основы добавления изображения, текста и кнопки к баннеру. Этот учебник написан для начинающих. Если вы никогда ранее не использовали Photoshop, вам следует ознакомиться с концепцией слоев в Photoshop. Чтобы узнать немного Облако Идентий Брокер Сервис
Обзор - сервис miniOrange Identity Broker С сервисом miniOrange Identity Broker вы можете одним щелчком мыши делегировать все свои требования к единому входу, управление пользователями, двухфакторную аутентификацию и даже доступ на основе риска, и сосредоточиться на своем экономическом обосновании. Мы можем интегрироваться с любым типом приложения, даже если оно не понимает ни одного стандартного протокола, такого как SAML, OpenId Connect или OAuth. Служба единого входа miniOrange Вашему вниманию Total Network Inventory 4 - программа для инвентаризации компьютеров и сетевого оборудования. ...
Вашему вниманию Total Network Inventory 4 - программа для инвентаризации компьютеров и сетевого оборудования. сканирование сети Сканирование компьютеров на базе Windows, OS X, Linux, FreeBSD и ESX / ESXi без использования предустановленных агентов - вам нужно знать только администраторский
Комментарии
Как подготовить кампанию, которая получит хорошие ссылки?Как подготовить кампанию, которая получит хорошие ссылки? Действия, направленные на получение хороших ссылок, должны быть комплексными и должным образом подготовленными. Стоит включить их в общую SEO-кампанию, подготовленную для компании, подготовленную совместно с агентством. Что позволит вам добиться успеха в этом вопросе? действия должны быть адаптированы к постоянно меняющимся алгоритмам поисковых систем; много положительного эффекта Exe , а также многие другие , Не знаете, что это за услуги?
Итак, что означает «хорошая ссылка» и как получить хорошие ссылки? Мы хотим поднять эту тему в этом посте. Почему хорошие ссылки так важны? Получение хороших ссылок очень важно из-за И куда они должны идти?
И куда они должны идти? Это именно то, на что похоже слайдер, также называемый каруселью, на главной целевой странице. Этот сценарий выше было бы странно видеть по телевизору, не так ли? Обычно Бэтмен видит сигнал, получает информацию от безупречно усатого комиссара Гордона и затем убивает плохих парней. Именно так должна работать ваша целевая страница.
Как подготовить кампанию, которая получит хорошие ссылки?
Что позволит вам добиться успеха в этом вопросе?
Итак, что означает «хорошая ссылка» и как получить хорошие ссылки?
Почему хорошие ссылки так важны?
И куда они должны идти?
Этот сценарий выше было бы странно видеть по телевизору, не так ли?