在Scala中匹配IP地址

3

作为一个新手学习Scala,我写了下面这段用于匹配IP地址的代码,但是却没有得到匹配结果。

val regex = """^(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))((\.(([0-9])|([1-9][0-9])|(1([0-9]{2}))|(2[0-4][0-9])|(25[0-5]))){3})$""".r
val i = "10.20.30.40"

def isValidIP(ip: String) = ip match {
    case regex(ip) => println(ip)
    case _ => println("No match.")
 }

isValidIP(i)

结果:没有匹配。 我已验证正则表达式模式按预期工作。
我错过了什么?

你的正则表达式无法匹配完整的IP地址。match 要求完整的字符串匹配。 - Wiktor Stribiżew
谢谢您的回复。很抱歉,我忘记添加 ^ 和 $,现在已经添加了。但是还是不起作用。如我所提到的,我已经验证过这个模式在正则表达式工具中是有效的。 - BjornTuroque
再次感谢。这个模式来自一个著名的正则表达式提供商,我没有重新发明任何东西。当我在这里运行它时,它的效果与预期完全一致:https://regex101.com/r/tU3gC3/3 和 http://refiddle.com/。 - BjornTuroque
谢谢。我已经尝试了那些方法,但都没有匹配结果。您能告诉我代码是正确的吗? - BjornTuroque
1
正确的,正则表达式和match需要完全匹配字符串不是唯一的问题,问题在于match还要求模式中有一个捕获组。如果您不想指定组,则需要使用regex(_*) => println(ip)来仅检查正则表达式是否与字符串匹配。基本上,解决方案是https://rextester.com/MPGK88781。 - Wiktor Stribiżew
显示剩余2条评论
1个回答

1
有几个问题:
  • 您的正则表达式存在问题,无法匹配完整的IP地址。您可以使用来自regular-expressions.info的著名IP地址验证正则表达式
  • match需要完整的字符串匹配
  • match还需要在模式中指定一个捕获组。如果您不想指定该组,则需要regex() => println(ip)仅检查正则表达式是否与字符串匹配。

您可以使用以下方式修复代码:

val regex = """(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)""".r
val i = "10.20.30.40"

def isValidIP(ip: String) = ip match {
    case regex() => println(ip)
    case _ => println("No match.")
}

isValidIP(i)

请看Scala代码演示

太好了,可以运行了,谢谢!最后一个问题,在Scala中这只是一个模式匹配还是完整的正则表达式匹配以及随之而来的所有“缓慢”呢? - BjornTuroque
@BjornTuroque 不确定我是否理解了这个问题。如果正则表达式匹配整个字符串并且编写正确,那么唯一的“缓慢”来自于正则表达式库需要加载和匹配执行的事实。如果它可以完成工作,那么就是你必须接受的开销。 - Wiktor Stribiżew
对于这个正则表达式模式,_* 是不必要的。如果没有捕获组,则 case regex() 就足够了。 - jwvh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接