regex - Scala 正则表达式联合

标签 regex scala

在 Ruby 中,如果我有两个正则表达式,我可以像这样创建另一个正则表达式:

a = /\d+/ # Matches digits
b = /\s+/ # Matches whitespaces
c = Regexp.union(a, b) # Matches sequences that consist only of digits or only of whitespaces

我想在 Scala 中做同样的事情,但我不知道如何做到这一点。请注意,我并不是要求使用语法来创建像 (\d+)|(\s+) 这样的字符类的联合。在前面的例子中,我真的在寻找从两个给定的正则表达式创建新正则表达式的可能性。

实际上,最后,我不会只为两个 Regexp 做,而是为大量的数字做。我不关心分组或任何事情,我只想知道 String 是否与给定 Regexp 列表中的一个匹配。我可以循环检查所有这些,但这太低效了,这就是为什么我需要一个 Regexp 来检查联合。

最佳答案

Scala 使用基于类 java.util.regex.Pattern 的 Java 正则表达式引擎。 . Pattern只有一种方法可以创建正则表达式:

public static Pattern compile(String regex)

就是这样,Scala 没有给你任何相关的增强。

但是你可以做的一件事是在 match 语句中使用内置的联合,这里显示了捕获组,以防你想从字符串中提取一些东西:
val Dig = """(\d+)""".r
val Wsp = """(\s+)""".r

scala> "45" match { case Dig(_) | Wsp(_) => println("found"); case _ => }

成立
scala> "   " match { case Dig(_) | Wsp(_) => println("found"); case _ => }

成立

如果你真的想要一个组合的正则表达式,你必须在字符串级别进行。你可以得到 java Pattern来自 .pattern 的 Scala 正则表达式,和另一个 .pattern然后获取字符串。大多数正则表达式可以安全地包装在 (?:) 中获得一个非捕获块,因此您可以像这样组合:
val Both = ("(?:"+Dig.pattern.pattern+")|(?:"+Wsp.pattern.pattern+")").r

但是,内部的任何捕获组都将被表示,但未使用的分支将是 null (不完全是编写惯用 Scala 的好方法,但无论如何,这是 Java 使用的):
scala> "2" match { case Both(d,w) => if (w!=null) println("white") else println(d) }
2

scala> " " match { case Both(d,w) => if (w!=null) println("white") else println(d) }
white

关于regex - Scala 正则表达式联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822757/

相关文章:

javascript - 使用正则表达式每 n 行分割一个字符串

python - 如何删除python中只包含数字的单词?

javascript - 在 javascript 中为除特定密码模式之外的所有内容编写正则表达式

python - 如何在Python中从数据包中获取IP地址?

Python Regex re.search 列表

scala - 如何使用类型标签/镜像在方法中获取构造函数参数?

scala - 运行 sbt 程序集时出错 : sbt deduplication error

scala - 在 spark/scala 中使用不同的预处理交叉验证多个模型

scala - SBT 多项目设置,其中子项目构建文件依赖于非托管 JAR

scala - 在 Scala 2.10 中,如何将两个通用列表中的每个元素添加在一起