繁体   English   中英

Scala中的匹配或正则表达式

[英]Matching or regular expression in scala

我有一个正则表达式,例如".*(A20).*|.*(B30).*|C" 我想写一个基于找到的匹配返回A20B30的函数。

val regx=".*(A20).*|.*(B30).*".r

"helloA20" match { case regx(b,_) => b; case _ => "" } // A20
"helloB30" match { case regx(b,_) => b; case _ => "" } // null
 "C" match { case regx(b,_) => b case _ => "" }

它返回null,因为我没有考虑第二组。 在我的实际代码中,我有很多这样的小组。 我想返回匹配的字符串。 请帮助我找到解决方案。

简单! 应该是这样的:

val regx="^(.*(B30|A20).*|(C))$".r

演示: https//regex101.com/r/nA6dQ9/1

然后,您将在每个组的数组中获得第二个值。 这就是我的意思!

这样一来,无论有多少可能性,您都只有一个小组。

您接近:

def extract(s: String) = s match {
 case regx(b, _) if b != null => b
 case regx(_, b) if b != null => b
 case _ => "" 
}

extract("helloA20")
res3: String = A20

extract("helloB30")
res4: String = B30

extract("A30&B30")
res6: String = B30

如果您有很多组,则可以合理地理解模式匹配。 此代码将返回第一个匹配项或“无”:

val letters = ('A' to 'Z').toSeq
val regex = letters.map(_.toString).mkString("(", "|", ")").r

def extract(s: String) = {
  for {
    m <- regex.findFirstMatchIn(s)
  } yield m.group(1)
}

extract("A=B=")
extract("dsfdsBA")
extract("C====b")
extract("a====E")

res0: Option[String] = Some(A)
res1: Option[String] = Some(B)
res2: Option[String] = Some(C)
res3: Option[String] = Some(E)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM