我一直在看这个部分匹配的例子
String[] ss = { "aabb", "aa", "cc", "aac" };
Pattern p = Pattern.compile("aabb");
Matcher m = p.matcher("");
for (String s : ss) {
m.reset(s);
if (m.matches()) {
System.out.printf("%-4s : match%n", s);
}
else if (m.hitEnd()) {
System.out.printf("%-4s : partial match%n", s);
}
else {
System.out.printf("%-4s : no match%n", s);
}
}
我想使用,hitEnd
用于我的scala模式匹配正则表达式
val VERSION = "([0-2].0)"
val MESSAGE = s"A message with version $VERSION".r
def checkMessage(action: String): Boolean = {
action match {
case MESSAGE(version) => true
case _ => false
}
}
我想要的是,如果有人输入A message with version 3.0
告诉他该邮件有部分匹配,但他输入的版本不正确。
知道如何在scala中使用此hitEnd
吗?
此致
答案 0 :(得分:1)
可以从Scala编译的正则表达式中获取Matcher
,但我认为它不会做你想要的。字符串"version"
是模式version [0-2].0
的部分匹配,但字符串"version 3.0"
不是。
val m = "version ([0-2].0)".r.pattern.matcher("")
for (s <- Seq("version 1.0", "v", "version ", "version 3.0")) {
m.reset(s)
if (m.matches) println(f"$s%-11s : match")
else if (m.hitEnd) println(f"$s%-11s : partial match")
else println(f"$s%-11s : no match")
}
输出:
version 1.0 : match
v : partial match
version : partial match
version 3.0 : no match
另一种方法是编译两种模式,一种用于一般情况,一种用于特定目标。
val prefix = "A message with version "
val goodVer = (prefix + "([0-2].0)").r
val someVer = (prefix + "(.*)").r
def getVer(str: String): String = str match {
case goodVer(v) => s"good: $v"
case someVer(v) => s"wrong: $v"
case _ => "bad string"
}
getVer("A message with version 2.0") //res0: String = good: 2.0
getVer("A message with version 3.0") //res1: String = wrong: 3.0
getVer("A message with version:2.0") //res2: String = bad string