regex - 如何在scala中的同一字符串上获取多个正则表达式
问题描述
我的要求是在给定的字符串中获取多个正则表达式模式。
"<a href=\"https://page1.google.com/ab-cd/ABCDEF\”>Hello</a> hiiii <a href=\"https://page2.yahoo.com/gr\”>page</a><img src=\"https://image01.google.com/gr/content/attachment/987654321\” alt=\”demo image\”></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
请让我知道,如何获得多个正则表达式模式,或者他们是否有其他简单的方法来做到这一点?
谢谢
解决方案
您可以使用
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)=\"(.*?)\"
匹配href
orimg src
,然后匹配 a="
,然后将除换行符之外的任何 0+ 字符捕获到组 1 中,然后"
匹配a- 使用
.findAllIn
,您将获得所有匹配项,然后.map(_ group 1)
仅获取第 1 组值。
推荐阅读
- java - 测试方法返回特定对象junit
- javascript - 使用 angular-cli 构建/示意图的摇树 CSS
- python - Python/数学素数查询
- docker - Docker 写入主机中的特定路径?
- angular - 类型“JQuery”上不存在属性“datetimepicker”
' - c++ - 共享需要外部库的 Visual Studio 项目
- python - 找不到模块健身房环境
- linux - 您如何在 GIT 存储库中保留符号链接?
- c - 枚举 C 中的基本数据类型,以便轻松访问大小
- angular - Ng-bootstrap timepicker.module 没有导出成员 'NgbTimeAdapter'