Регулярное выражение, получить все гиперссылки

#java #regex

#java #регулярное выражение

Вопрос:

Я пытаюсь выяснить, как получить 2 совпадения из строки Bla bla bla [https://google.com|Google] bla bla bla [https://youtube.com|Youtube]

Я хочу получить 2 совпадения : [https://google.com|Google], [https://youtube.com|Youtube] . Мое регулярное выражение выглядит следующим образом: [.*|.*] и с ним я получаю только одно совпадение: [https://google.com|Google] bla bla bla [https://youtube.com|Youtube] так что это неправильный ответ. Как получить правильный ответ?

PS google и youtube — жестко закодированный пример. Я получаю массив данных с более чем 1000 записями, поэтому мне нужно универсальное решение.

Комментарии:

1. .* является жадным. Сделайте это неохотно, добавив ? like .*? .

Ответ №1:

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

 [([^][|]*)|([^][]*)]
 

Посмотрите демонстрацию регулярных выражений. Подробные сведения:

  • [ [ символ
  • ([^][|]*) — Группа 1: любые нулевые или более символов, кроме [ , ] и |
  • | | символ
  • ([^][]*) — Группа 2: любые нулевые или более символов, кроме [ и ]
  • ] ] символ.

В Java используйте

 String regex = "\[([^\]\[|]*)\|([^\]\[]*)]";
 

Посмотрите демонстрацию Java:

 String s = "Bla bla bla [https://google.com|Google] bla bla bla [https://youtube.com|Youtube]";
String regex = "\[([^\]\[|]*)\|([^\]\[]*)]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println("Match: "   matcher.group(0));
    System.out.println("Group 1: "   matcher.group(1));
    System.out.println("Group 2: "   matcher.group(2));
} 
 

Вывод:

 Match: [https://google.com|Google]
Group 1: https://google.com
Group 2: Google
Match: [https://youtube.com|Youtube]
Group 1: https://youtube.com
Group 2: Youtube
 

Комментарии:

1. Спасибо за ваш ответ! Но также было необходимо добавить https в первую группу захвата

2. @MikhailGulyaev Миша, https присутствует в совпадениях. Если вы имеете в виду, что это должно быть частью шаблона, просто добавьте его, [(https[^][|]*)|([^][]*)]

Ответ №2:

вам нужно сделать квантификатор * ленивым, добавив?отметьте, вот пример :

 String  s = "Bla bla bla [https://google.com|Google] bla bla bla [https://youtube.com|Youtube]";
Pattern p = Pattern.compile("\[.*?\]");
Matcher matcher = p.matcher(s);

while(matcher.find()){
    System.out.println(matcher.group());
}
 

ВЫВОД :

 [https://google.com|Google]
[https://youtube.com|Youtube]