Matcher.group()返回预期结果的一部分。例如,URL“ www.google.com”,我的匹配器返回“ www。”。

问题描述 投票:-1回答:1

我的要求是使用正则表达式检查字符串中的URL。我正在使用模式和匹配器查找字符串是否包含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)

我期望使用网址“ www.google.com”,但返回的是“ www。”。

任何想法都可能成为问题。任何帮助都将被大大接受。

java android regex url kotlin
1个回答
0
投票

toString()toString()方法的文档

返回此正则表达式的字符串表示形式,即此正则表达式的Regex

请注意,由相同模式字符串构造的另一个正则表达式可能具有不同的Regex,并且可能会以不同的方式匹配字符串。

这意味着它与pattern字符串options选项相同。

因此,当您执行regularExpression时,会丢失不区分大小写的选项,这就是IGNORE_CASE不匹配的原因,因为您的正则表达式仅匹配val pattern = Pattern.compile(HyperlinkParser.validRegex.toString())

将该行更改为:

google.com

这将起作用,因为A-Z文档说:

返回带有[[相同模式字符串和选项val pattern = HyperlinkParser.validRegex.toPattern() 的实例,与此toPattern的实例一样。

[在需要Pattern的情况下提供使用Regex的方式。
© www.soinside.com 2019 - 2024. All rights reserved.