首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用regex匹配提取两个子字符串

使用regex匹配提取两个子字符串
EN

Stack Overflow用户
提问于 2018-04-23 18:02:00
回答 2查看 183关注 0票数 1

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

我希望使用regex模式从该字符串中提取值32C1234*3

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

代码语言:javascript
代码运行次数:0
运行
复制
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的尝试:

代码语言:javascript
代码运行次数:0
运行
复制
val s = "32*C1234*3"
val re = """(\d*)\*(C.*)""".r
(r findFirstIn s).toList

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-23 18:12:14

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

代码语言:javascript
代码运行次数:0
运行
复制
val m = re.findFirstMatchIn(s).get
val x1 = m.group(1)
val x2 = m.group(2)

将变量mx1x2设置为:

代码语言:javascript
代码运行次数:0
运行
复制
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*"将返回与相同组相同的匹配。

票数 1
EN

Stack Overflow用户

发布于 2018-04-23 18:12:57

代码语言:javascript
代码运行次数:0
运行
复制
s match {
  case re(a,b) => s"x1 = $a , x2 = $b"
  case _ => "error"
}

在regex模式中有两个捕获组,所以匹配模式必须提供2个变量来保存匹配的值。

要将所有匹配的捕获组作为List[String]获取,您可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
re.unapplySeq(s).getOrElse(List.empty)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49987311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档