Ruby - регулярное выражение, разрешающее любые не ASCII - китайские символы в URL - PullRequest
2 голосов
/ 04 октября 2019

Я пытаюсь написать регулярное выражение для URL, который также содержит китайские символы. Назначение такого регулярного выражения заключается в том, что всякий раз, когда встречается URL-адрес, содержащий китайские символы, он не совпадает с URL-адресом и выдает результат, так как ничего не найдено.

У меня есть регулярное выражение, которое работает для обычных URL-адресов, как показано ниже:

^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

Это относится ко всему, что, например, www.google.com, но не работает для таких URL, как http://www.詹姆斯.com/.

Я также попробовал модуль Ruby URI для проверки URL, но он не работает.

Я использую Rubular для проверки моего регулярного выражения.

Ожидается : регулярное выражение в Ruby, которое проверяет любой URL, включая символы на любом языке (например, на французском, китайском и т. Д.), А также параметры строки запроса как http://www.詹姆斯.com/?abc=1234.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Я не уверен насчет остальной части вашего регулярного выражения (часть запроса / пути), поэтому позвольте мне сосредоточиться только на части хоста. Вам нужно использовать классы символов Unicode, например \p{L} вместо [a-z], который только для ASCII. Например:

'http://www.詹姆斯.com/?abc=1234'.match(/^(https?:\/\/)?([\d\p{L}\.-]+)/)
# => #<MatchData "http://www.詹姆斯.com" 1:"http://" 2:"www.詹姆斯.com">

Подробнее в документах .

1 голос
/ 04 октября 2019

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

/\A(?:https?:\/\/)?(?!www\.[^\/]*\z)[\d\p{L}_.-]+\.[\p{L}.]{2,6}(?:\/[^\s\/]+)*\/?\z/

См. Демонстрационную версию regex

ПРИМЕЧАНИЕ. Чтобы сопоставить целую строку с регулярным выражением Ruby, следует использовать \A и\z, а не ^ и $, которые соответствуют началу и концу любой строки . Вот почему демо отличается от окончательного опубликованного регулярного выражения.

Детали шаблона

  • \A - начало строки
  • (?:https?:\/\/)? - необязательный http:// или https://
  • (?!www\.[^\/]*\z) - текст, который находится непосредственно справа, не может быть www. и сопровождаться любыми 0+ символами, кроме / доконец строки
  • [\d\p{L}_.-]+ - 1 или более цифр, букв, _, . или - символов
  • \. - точка
  • [\p{L}.]{2,6} - от 2 до 6 букв или точек
  • (?:\/[^\s\/]+)* - 0 или более последовательностей / и 1+ символов, кроме пробелов и /
  • \/? -необязательный /
  • \z - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...