正则表达式在scala中使用hitEnd

时间:2017-07-17 12:33:29

标签: java regex scala

我一直在看这个部分匹配的例子

    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吗?

此致

1 个答案:

答案 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