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 :(得分:0)
我将您的正则表达式读为:
?
等)的0或1(http://
修饰符)https://
实例,www.
修饰符)字母数字字符+
是正则表达式的特殊字符,请记住,代表任何一个字符),.
修饰符)的字母数字,*
).
是精确计数修饰符){3}
)如果将regex插入regex101.com,您不仅会看到类似的故障(尽管我认为我钉上了钉,但我可能没有犯任何错误),而且您还将有机会测试各种反对它。然后,一旦您的正则表达式按照您想要的方式工作,就可以将它们重新带回脚本中。这是一个可靠的工作流程,既可以学习正则表达式,也可以为特定目的开发表达式。
如果将正则表达式和输入放到正则表达式101中,您将明白为什么得到输出的原因。但是,这里有一个提示:当您要求正则表达式匹配.?
时,没有任何内容将"url is ftp://filezilla.com"
排除在匹配之外。这就是为什么您不符合所需方案的原因。 Regex101确实是进一步调查此问题的好方法。
答案 1 :(得分:0)
正则表达式可以更新为
((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,})
这就是我所需要的。