scala中的匹配或正则表达式
Matching or regular expression in scala
我有一个像 ".*(A20).*|.*(B30).*|C"
这样的正则表达式。
我想根据找到的匹配项 returns A20
或 B30
编写一个函数。
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 _ => "" }
return无效,因为我不考虑第二组。在我的实际代码中,我有很多这样的组。我想 return 匹配的字符串。请帮我找到解决办法。
你很接近:
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
如果你有很多组,使用理解而不是模式匹配是合理的。此代码将 return 首先匹配或 None:
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)
简单!应该是这样的:
val regx="^(.*(B30|A20).*|(C))$".r
演示:https://regex101.com/r/nA6dQ9/1
然后你得到每组数组中的第二个值。
这样不管有多少种可能性,你只有一组。
我有一个像 ".*(A20).*|.*(B30).*|C"
这样的正则表达式。
我想根据找到的匹配项 returns A20
或 B30
编写一个函数。
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 _ => "" }
return无效,因为我不考虑第二组。在我的实际代码中,我有很多这样的组。我想 return 匹配的字符串。请帮我找到解决办法。
你很接近:
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
如果你有很多组,使用理解而不是模式匹配是合理的。此代码将 return 首先匹配或 None:
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)
简单!应该是这样的:
val regx="^(.*(B30|A20).*|(C))$".r
演示:https://regex101.com/r/nA6dQ9/1
然后你得到每组数组中的第二个值。
这样不管有多少种可能性,你只有一组。