使用正则表达式匹配

时间:2018-04-23 18:02:01

标签: regex scala match

我有一个简单的正则表达式模式和一个字符串。正则表达式模式为(\d*)\*(C.*),字符串为32*C1234*3

我想使用该正则表达式模式从该字符串中提取值32C1234*3

我可以使用以下代码在Perl中实现:

my $x = "32*C1234*3"; 
if ( my ($x1, $x2) = $x =~ /(\d*)\*(C.*)/ ) {
    print "x1 = $x1, x2 = $x2\n";
} else {
    print "No match\n";
}

以下是我尝试使用Scala 2.11:

val s = "32*C1234*3"
val re = """(\d*)\*(C.*)""".r
(r findFirstIn s).toList

当我运行它时,我得到一个值(它是原始列表后跟空字符)而不是32C1234*3。如何修复scala代码?

2 个答案:

答案 0 :(得分:2)

s match {
  case re(a,b) => s"x1 = $a , x2 = $b"
  case _ => "error"
}

您在正则表达式模式中有2个捕获组,因此匹配模式必须提供2个变量来保存匹配的值。

要将所有匹配的捕获组作为List[String],您可以执行此操作:

re.unapplySeq(s).getOrElse(List.empty)

答案 1 :(得分:1)

使用findFirstMatchIn,然后使用Match对象选择所需的群组:

val m = re.findFirstMatchIn(s).get
val x1 = m.group(1)
val x2 = m.group(2)

将变量mx1x2设置为:

m: scala.util.matching.Regex.Match = 32*C1234*3*
x1: String = 32
x2: String = C1234*3*

Perl中的if ... - 部分被Scala中的Option[Match]替换。如果您不确定字符串是否实际匹配,则必须先检查findFirstMatchIn isEmpty的结果。或者,您可以在返回的Option上进行模式匹配。在上面的示例中,我只使用了get,因为显然存在匹配。

findFirstMatchIn未固定,因此字符串"blah|32*C1234*3*"将返回与相同组相同的匹配。