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

时间:2018-09-28 00:04:10

标签: regex scala

        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:

我如何管理正则表达式模式,以便两个字符串都能很好地匹配。 这些符号在正则表达式中实际上意味着什么。我对正则表达式非常陌生。请帮忙。

2 个答案:

答案 0 :(得分:0)

我将您的正则表达式读为:

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

这就是我所需要的。