首页 > 解决方案 > 如何在scala中的同一字符串上获取多个正则表达式

问题描述

我的要求是在给定的字符串中获取多个正则表达式模式。

"<a href=\"https://page1.google.com/ab-cd/ABCDEF\”&gt;Hello</a> hiiii <a href=\"https://page2.yahoo.com/gr\”&gt;page</a><img src=\"https://image01.google.com/gr/content/attachment/987654321\” alt=\”demo image\”&gt;</a><a href=\"https://page3.google.com/hr\">"

使用以下代码:

val p = Pattern.compile("href=\"(.*?)\"")
    val m = p.matcher(str)
    while(m.find()){
      println(m.group(1))
    }

我得到输出:

https://page1.google.com/ab-cd/ABCDEF
https://page2.yahoo.com/gr
https://page3.google.com/hr

随着模式的变化:

val p = Pattern.compile("img src=\"(.*?)\"")

我得到输出:

https://image01.google.com/gr/content/attachment/987654321

但是有模式:

val p = Pattern.compile("href=\"(.*?)\"|img src=\"(.*?)\"")

我得到输出:

https://page1.google.com/ab-cd/ABCDEF
https://page2.yahoo.com/gr
Null
https://page3.google.com/hr 

请让我知道,如何获得多个正则表达式模式,或者他们是否有其他简单的方法来做到这一点?

谢谢

标签: regexscalapattern-matching

解决方案


您可以使用

val rx = "(?:href|img src)=\"(.*?)\"".r
val results = rx.findAllMatchIn(s).map(_ group 1)
// println(results.mkString(", ")) prints:
//  https://page1.google.com/ab-cd/ABCDEF, 
//  https://page2.yahoo.com/gr, 
//  https://image01.google.com/gr/content/attachment/987654321, 
//  https://page3.google.com/hr

查看Scala 演示

细节

  • (?:href|img src)=\"(.*?)\"匹配hrefor img src,然后匹配 a =",然后将除换行符之外的任何 0+ 字符捕获到组 1 中,然后"匹配a
  • 使用.findAllIn,您将获得所有匹配项,然后.map(_ group 1)仅获取第 1 组值。

推荐阅读