【问题标题】:Matching or regular expression in scalascala中的匹配或正则表达式
【发布时间】:2016-08-16 02:33:48
【问题描述】:

我有一个像".*(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 因为我不考虑第二组。在我的实际代码中,我有很多这样的组。我想返回匹配的字符串。请帮我找到解决方案。

【问题讨论】:

  • 我认为你只需要.*(A20|B30).*。您是否需要整个字符串或捕获的值?如果您不需要捕获的值,只需使用.*(?:A20|B30).*
  • @WiktorStribiżew 谢谢。我的正则表达式会有不同的 or(|) 条件和不同的逻辑,比如“。*(A20).*|(B30)|(C)”。我需要捕获的值进一步处理,如 A20,B30,C
  • 然后给我们完整的例子,以便我们更好地帮助你。

标签: regex scala switch-statement pattern-matching regex-group


【解决方案1】:

简单!应该是这样的:

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

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

然后你得到每个组的数组中的第二个值。

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

【讨论】:

  • 对不起,如果我不清楚这个问题,.* 对于整个模式并不常见。我正在处理这样的模式 .*(A20).*|(B30)|(C)" 。在 B30 和 C 中,它不应该以任何其他字符串开头。我会更新我的问题。@aminahnuraini
【解决方案2】:

你已经接近了:

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)

【讨论】:

  • @vitailykotlyarenko 谢谢。您的解决方案运行良好。但是我有几个这样的小组。我必须为每个小组写案例陈述还是有比这更好的解决方案。
  • @vitailykotlyarenko,感谢它工作正常。某些情况,例如 extract("===B")( if a match found and index > 1) 我得到一个数组索引超出范围异常。我认为我们正在将位置索引与组索引匹配。我试图更改为 m.group(1),因为我们只有一个组,现在它没有抛出任何异常。如果使用 m.group(1) 有任何问题,请告诉我。
  • 你说得对,m.group(1) 是正确的。我在星期天晚上写了我的代码,而不是编码的最佳时间)。检查我上次的编辑,修复后变得更加简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2023-04-02
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
相关资源
最近更新 更多