SCALA 正则表达式:在句子中查找匹配的 URL rgex


import java.util.regex._

object RegMatcher extends App {
val str="facebook.com"
val urlpattern="(http://|https://|file://|ftp://)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]{3}.?([a-z]+)?"
var regex_list: Set[(String, String)] = Set()
val url=Pattern.compile(urlpattern)
var m=url.matcher(str)
if (m.find()) {

regex_list += (("date", m.group(0)))
println("match: " + m.group(0))
}
val str2="url is ftp://filezilla.com"
m=url.matcher(str2)
if (m.find()) {
regex_list += (("date", m.group(0)))
println("str 2 match: " + m.group(0))
}
}

这返回

match: facebook.com
str 2 match: url is ftp:

如何管理正则表达式模式,以便两个字符串匹配良好。 这些符号在正则表达式中的实际含义是什么。我对正则表达式很陌生。请帮忙。

我把你的正则表达式读作:

  • 0或1(?修饰符(的方案(http://https://等(
  • 后跟 0 或 1 个www.实例,
  • 后跟 1 个或多个(+修饰符(字母数字字符,
  • 后跟任何字符(.是正则表达式特殊字符,请记住,代表任何一个字符(,
  • 后跟 0 或更多(*修饰符(字母数字,
  • 后跟任何字符(再次.(
  • 后跟 3 个小写字母({3}是精确计数修饰符(
  • 后跟任意字符的 0 或 1 (.?(
  • 后跟一个或多个低写字母。

如果你将正则表达式插入 regex101.com,你不仅会看到类似的故障(我没有犯任何错误,尽管我认为我搞定了(,而且你还有机会测试各种字符串。 然后,一旦您的正则表达式按照您想要的方式工作,您就可以将它们带回您的脚本。 这是一个可靠的工作流程,用于学习正则表达式和为特定目的开发表达式。

如果你把你的正则表达式和你的输入放到正则表达式 101 中,你就会明白为什么你会得到你看到的输出。 但这里有一个提示:当你要求你的正则表达式匹配"url is ftp://filezilla.com"时,没有什么能排除"url is"成为匹配的一部分。 这就是为什么你没有匹配你想要的方案。 Regex101确实是进一步研究这个问题的好方法。

正则表达式可以更新为

((ftp|https|http?)://(?:www.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|www.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,})

这就是我所需要的。

最新更新