当前位置: 首页 > 知识库问答 >
问题:

在Scala中匹配多个正则表达式模式时忽略组

有骏祥
2023-03-14

我的目标是以优雅的方式将几个正则表达式模式匹配到同一个字符串。我知道有必要使用组来进行这种类型的正则表达式匹配,并且为了使用下面的匹配功能,我需要在casePattern(_,_)语句中显式捕获这些组中的每一个(例如,两个组在case语句中需要两个_)。

import scala.util.matching.UnanchoredRegex

val regexPattern1 = "(Some)|(Pattern)".r.unanchored
val regexPattern2 = "(That)|(Other)|(pattern)".r.unanchored
val regexPattern3 = "(A)|(Whole)|(Different)|(One)".r.unanchored

"Some string to match patterns against" match {
    case regexPattern1(_,_) => 1
    case regexPattern2(_,_,_) => 2
    case regexPattern3(_,_,_,_) => 3
}

现在,我有以下几点考虑:

  1. 从下划线的使用中可以明显看出,我不关心捕捉模式的特定组,只关心任何第一个匹配。
  2. 我的实际模式非常复杂,因此为了可管理性,我更愿意将它们保留为单独的unanchoredregex对象,而不是将它们视为同一regex模式中的不同捕获组。
  3. 由于这种复杂性(嵌套组),很难跟踪要放入大小写SomePattern(_,_,...n)语句中的捕获组的数量。如果我没有弄对这一点,模式当然会默默地失败。这使得更新或调整我的模式以及随后调试正则表达式匹配变得很烦人。
  4. 我喜欢上面的语法的简洁和优雅,通过对几个模式进行一次匹配,所以我更愿意保留这一点,而不是为每个模式编写一个match/if子句。

现在,我的问题是:有没有一种方法保留上面的语法,省去(我的目的)无用的_,_,_,...部分,而是匹配任何第一次命中?

共有1个答案

马坚白
2023-03-14

regex类实现与unapplyseq的匹配。这意味着您可以忽略具有_*模式的每个组:

"Some string to match patterns against" match {
    case regexPattern1(_*) => 1
    case regexPattern2(_*) => 2
    case regexPattern3(_*) => 3
}
 类似资料:
  • 我试图创建一个匹配特定模式的正则表达式,但我想忽略以开头的行。我怎么做? 如果一行不是以哈希开头,它应该被使用,就像我想要阻止攻击性语言一样,在这种情况下,它应该被覆盖。

  • 给定下面的字符串 [NeMo(PROD)]10.10.100.100(EFA-B-3)[博科FC-Switch]传感器:电源#1(SNMP自定义表)关闭(无此名称(SNMP错误#2)) 我尝试获取多个匹配项以提取以下值: 因为我是正则表达式的初学者,所以我试图定义一些“规则”: 提取第一个圆括号内的第一个值,例如PROD 提取第一个闭合方括号和第二个开口圆括号之间的值,例如10.10.100.10

  • 本文向大家介绍Scala中正则表达式以及与模式匹配结合(多种方式),包括了Scala中正则表达式以及与模式匹配结合(多种方式)的使用技巧和注意事项,需要的朋友参考一下 正则表达式 说明:.r()方法简介:Scala中将字符串转换为正则表达式 模式匹配一 说明:findAllIn(…)函数简介 模式匹配二 模式匹配三 模式匹配四 本节所有程序源码 总结 以上所述是小编给大家介绍的Scala中正则表达

  • 问题内容: 我正在制作一个键值解析器,其中输入字符串采用的形式。键可以包含字符,并且和值可以包含任何字符,但,,和需要用反斜杠前缀。逗号用于分隔键值对,但在最后一对之后不需要。 到目前为止,我已经可以匹配大多数键和值,但是很显然它将不能处理多于一对的字符或者任何“控制”字符都不能转义。似乎匹配所有转义字符,但不匹配任何“正常”字符。 有没有办法检查逗号分隔并匹配所有转义的“控制”字符以及普通字符?

  • 有没有一种方法可以在python中编写与以下格式的字符串匹配的正则表达式: 或 在这里,$=表示零或更多的空白可以存在 :来自字符串的固定子集的字符串['feat','fix','docs','断'] :最大长度为n的字符串 :最大长度为m的字符串 前缀应该始终是一个字符串,之后是一些最大q长度的字母数字字符 注意:我们不能省略像应该使用与下面示例中所示完全相同的格式: feat(feat new

  • 我们得到了一些这样的内容: