Как получить несколько регулярных выражений для одной строки в Scala - PullRequest
1 голос
/ 06 июня 2019

Мое требование - получить несколько шаблонов регулярных выражений в заданной строке.

"<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 

Пожалуйста, дайте мне знать, как получить несколько шаблонов регулярных выражений или есть ли другой способ сделать это?

Спасибо

1 Ответ

1 голос
/ 06 июня 2019

Вы можете использовать

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 или img src, затем =", а затем захватывает любые 0+ символов, кроме символов перевода строки, как можно меньше в Группу 1, а затем " сопоставляется
  • При .findAllIn вы получаете все совпадения, тогда .map(_ group 1) извлекает только значения группы 1.
...