Регулярное выражение в GWT для соответствия URL - PullRequest
3 голосов
/ 20 января 2010

Я реализовал класс Pattern, как показано здесь: http://www.java2s.com/Code/Java/GWT/ImplementjavautilregexPatternwithJavascriptRegExpobject.htm

И я хотел бы использовать следующее регулярное выражение для сопоставления URL-адресов в моей строке:

(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?

К сожалению, Javaкомпилятору, конечно, не удается выполнить синтаксический анализ этой строки, потому что он не использует допустимые escape-последовательности (поскольку вышеприведенное является технически шаблоном URL для JavaScript, а не Java)

В конце концов, я ищушаблон регулярного выражения, который будет компилироваться в Java и корректно выполняться в JavaScript.

Ответы [ 3 ]

9 голосов
/ 20 января 2010

Вы должны будете использовать JSNI для выполнения части оценки регулярных выражений в Javascript.Если вы напишите регулярное выражение с экранированными обратными косыми чертами, это будет преобразовано в Javascript как есть и, очевидно, будет недействительным.Предполагается, что он будет работать в режиме Hosted или Dev, так как он все еще работает с байт-кодом Java, но не в скомпилированном приложении.

Простой пример JSNI для проверки, является ли заданная строка действительным URL:

// Java method
public native boolean isValidUrl(String url) /*-{
    var pattern = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
    return pattern.test(url);
}-*/;

Могут быть и другие нарушения в механизмах регулярных выражений Java и Javascript, поэтому лучше полностью разгрузить их в Javascript, по крайней мере, для умеренно сложных регулярных выражений.

2 голосов
/ 20 января 2010

Я не знаю точно, как это могло бы помочь, но вот точная функция, которую вы запросили в Javascript.Я думаю, что использование JSNI, как сказал Анураг, поможет.

var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?";

function isValidURL(url) {

    urlPattern = "^" + urlPattern + "$";
    var regex = new RegExp(urlPattern);

    return regex.test(url);

}

Как и то, что сказал @ S.Mark , я в основном выбрал "Java" способ выполнения регулярных выражений в Javascript.

В Java вы просто сделали бы это следующим образом (посмотрите, как выглядит одно и то же выражение).

String urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?";

Надеюсь, это поможет.PS, это регулярное выражение работает и даже проверяет сайты, указывающие на localhost: порт), где порт - это любой номер порта.

2 голосов
/ 20 января 2010

Сам шаблон выглядит нормально, но я думаю, это из-за экранирования обратной косой черты.

Пожалуйста, посмотрите это http://www.regular -expressions.info / java.html

В буквальных строках Java обратная косая черта является escape-символом.Буквенная строка "\\" - это одиночная обратная косая черта.В регулярных выражениях обратный слеш также является escape-символом.Регулярное выражение \\ соответствует одиночному обратному слешу.Это регулярное выражение в виде строки Java становится "\\\\".Правильно: 4 обратных слеша соответствуют одному.

Итак, если вы повторно используете свое регулярное выражение Javascript в java, вам нужно заменить \ на \\ и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...