我有一个简单的正则表达式和一个字符串。正则表达式模式是(\d*)\*(C.*)
,字符串是32*C1234*3
。
我希望使用regex模式从该字符串中提取值32
和C1234*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";
}
下面是我使用Scala2.11的尝试:
val s = "32*C1234*3"
val re = """(\d*)\*(C.*)""".r
(r findFirstIn s).toList
当我运行它时,我只得到一个值(它是原来的列表,后面是空字符),而不是32
和C1234*3
。如何修复scala代码?
发布于 2018-04-23 10:12:14
使用findFirstMatchIn
,然后使用Match
对象选择所需的组:
val m = re.findFirstMatchIn(s).get
val x1 = m.group(1)
val x2 = m.group(2)
将变量m
、x1
、x2
设置为:
m: scala.util.matching.Regex.Match = 32*C1234*3*
x1: String = 32
x2: String = C1234*3*
Perl中的if ...
-part被Scala中的Option[Match]
所取代。如果不确定字符串是否实际匹配,则必须首先检查findFirstMatchIn
isEmpty
的结果是否匹配。或者,您可以在返回的Option
上进行模式匹配。在上面的示例中,我只使用了get
,因为很明显存在匹配。
findFirstMatchIn
没有锚定,因此字符串"blah|32*C1234*3*"
将返回与相同组相同的匹配。
发布于 2018-04-23 10:12:57
s match {
case re(a,b) => s"x1 = $a , x2 = $b"
case _ => "error"
}
在regex模式中有两个捕获组,所以匹配模式必须提供2个变量来保存匹配的值。
要将所有匹配的捕获组作为List[String]
获取,您可以这样做:
re.unapplySeq(s).getOrElse(List.empty)
https://stackoverflow.com/questions/49987311
复制