Matcher.group () возвращает часть ожидаемого результата. Для URL «www.google.com» мой matcher возвращает «www.» - PullRequest
0 голосов
/ 05 марта 2020

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

 val pattern = Pattern.compile(HyperlinkParser.validRegex.toString())
    val matcher = pattern.matcher(htmlParsedMessage) //"abcd www.google.com def"
    while (matcher.find()) {
        val url = matcher.group()//contains the required url but it returns "www.".Expected "www.google.com"
        val indicesPair = Pair(matcher.start(), matcher.end())
        hyperlinkStartEndIndicesList.add(indicesPair)
    }
    matcher.reset()

Где HyperlinkParser.validRegex равно

private const val regularExpression = "(?:(?:https?|ftp|file):|www.|ftp.)(?:([-A-Z0-9+&@#/%=~_|\$?!:,.]*)|[-A-Z0-9+&@#/%=~_|\$?!:,.])*(?:([-A-Z0-9+&@#/%=~_|\$?!:,.]*)|[A-Z0-9+&@#/%=~_|\$])"
val validRegex = Regex(regularExpression,RegexOption.IGNORE_CASE)

Я ожидаю URL-адрес "www.google.com" но он возвращает «www.».

Любые идеи, в чем может быть проблема. Любая помощь будет принята.

1 Ответ

0 голосов
/ 05 марта 2020

Документация toString() метода Regex:

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

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

Это означает, что оно совпадает с regularExpression строкой без опции IGNORE_CASE .

Так что, когда вы делаете val pattern = Pattern.compile(HyperlinkParser.validRegex.toString()), вы теряете опция без учета регистра, и поэтому google.com не совпадает, поскольку ваше регулярное выражение соответствует только A-Z.

Измените эту строку на:

val pattern = HyperlinkParser.validRegex.toPattern()

Это будет работать, потому что документация из toPattern гласит:

Возвращает экземпляр Pattern с такой же строкой шаблона и параметры , поскольку этот экземпляр Regex имеет.

Предоставляет способ использования Regex где Требуется шаблон .

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