java Matcher。group()正在返回预期结果的一部分。对于前一个url“www.google.com”,我的matcher返回“www”
我的要求是使用正则表达式检查字符串中的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)
我期待着URL“www.google.com”,但它返回“www.”
你知道问题出在哪里吗。任何帮助都会被极大地接受
# 1 楼答案
关于^{} 的^{} 方法的文档:
这意味着它与不带
IGNORE_CASE
选项的regularExpression
string相同因此,当您执行
val pattern = Pattern.compile(HyperlinkParser.validRegex.toString())
时,您会丢失不区分大小写的选项,这就是为什么google.com
不匹配,因为您的正则表达式只匹配A-Z
将该行更改为:
这是可行的,因为
toPattern
的文档说: