Проблема Java и Javascript Regex - PullRequest
1 голос
/ 01 мая 2009

У меня проблема с моим регулярным выражением: <a.*href=[\"'](.*?)[\"'].*>(.*?)</a>. Как вы, вероятно, можете сказать, он должен взять все ссылки из строки HTML и вернуть текст ссылки в группе 2, а цель ссылки - в группе 1. Но у меня возникла проблема. Если я попробую его в Javascript (используя http://www.regextester.com/, со всеми включенными флагами), он будет работать нормально, но в Java, вот так:

Pattern myPattern = Pattern.compile("<a.*href=[\"'](.*?)[\"'].*>(.*?)</a>", Pattern.CASE_INSENSITIVE);
Matcher match = myPattern.matcher(htmlData);
while(match.find()) {
 String linkText = match.group(2);
 String linkTarget = match.group(1);
}

Я не получаю все ожидаемые результаты. С тестером regex я получаю гораздо больше, и он работает точно так, как и должно, но с версией Java он просто получает 1 или 2 ссылки на страницу.
Извините, если это очевидно, но я новичок в регулярных выражениях.
Спасибо,
Исаак Уоллер

Редактировать: Я думаю, что-то не так с моим регулярным выражением. Смотрите, с этой страницы Apache indexof:

<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Bryan%20Adams%20-%20Here%20I%20Am.mp3">Bryan Adams - Here I Am.mp3</a></td><td align="right">27-Aug-2008 11:48  </td><td align="right">170K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Cars%20-%20Drive.mp3">Cars - Drive.mp3</a></td><td align="right">26-Aug-2008 19:04  </td><td align="right">149K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Cock%20Robin%20-%20When%20Your%20Heart%20Is%20Weak.mp3">Cock Robin - When Your Heart Is Weak.mp3</a></td><td align="right">26-Aug-2008 19:04  </td><td align="right">124K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Colbie%20Caillat%20-%20Bubbly.mp3">Colbie Caillat - Bubbly.mp3</a></td><td align="right">27-Aug-2008 11:49  </td><td align="right">215K</td></tr>

<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Colbie%20Caillat%20-%20The%20Little%20Things.mp3">Colbie Caillat - The Little Things.mp3</a></td><td align="right">27-Aug-2008 11:49  </td><td align="right">176K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Coldplay%20-%20Violet%20Hill.mp3">Coldplay - Violet Hill.mp3</a></td><td align="right">27-Aug-2008 11:49  </td><td align="right">136K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Corrs%20-%20Radio.mp3">Corrs - Radio.mp3</a></td><td align="right">26-Aug-2008 19:04  </td><td align="right">112K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Corrs%20-%20What%20Can%20I%20Do.mp3">Corrs - What Can I Do.mp3</a></td><td align="right">26-Aug-2008 19:04  </td><td align="right">146K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Counting%20Crows%20-%20Big%20Yellow%20Taxi.mp3">Counting Crows - Big Yellow Taxi.mp3</a></td><td align="right">26-Aug-2008 19:04  </td><td align="right">135K</td></tr>

<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Curtis%20Stigers%20-%20I%20Wonder%20Why.mp3">Curtis Stigers - I Wonder Why.mp3</a></td><td align="right">26-Aug-2008 19:03  </td><td align="right">213K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Cyndi%20Lauper%20-%20Time%20After%20Time.mp3">Cyndi Lauper - Time After Time.mp3</a></td><td align="right">26-Aug-2008 19:03  </td><td align="right">193K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="David%20Bowie%20-%20Absolute%20Beginners.mp3">David Bowie - Absolute Beginners.mp3</a></td><td align="right">26-Aug-2008 19:04  </td><td align="right">155K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Depeche%20Mode%20-%20Enjoy%20The%20Silence.mp3">Depeche Mode - Enjoy The Silence.mp3</a></td><td align="right">26-Aug-2008 19:03  </td><td align="right">230K</td></tr>
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Dido%20-%20White%20Flag.mp3">Dido - White Flag.mp3</a></td><td align="right">27-Aug-2008 11:48  </td><td align="right">158K</td></tr>

Я должен получить:
1: Брайан% 20 Адамс% 20-% 20 Здесь% 20I% 20Am.mp3
2: Брайан Адамс - вот и я .mp3
и многое другое. С тестером Regex я получаю все результаты, которые хочу. С Java я не получаю ничего.

Ответы [ 2 ]

3 голосов
/ 01 мая 2009

Вы должны экранировать символы обратной косой черты и кавычки:

Pattern myPattern = Pattern.compile("<a.*href=[\\\"'](.*?)[\\\"'].*>(.*?)</a>", Pattern.CASE_INSENSITIVE);

Однако это может быть не вашей реальной проблемой. Обратные слеши не нужны в шаблоне. Есть и другие возможные проблемы с шаблоном.

Вы используете жадное сопоставление перед свойством href, что означает, что оно будет совпадать с начала первой ссылки в строке до свойства href последней ссылки в строке. Сделайте совпадение нежадным, изменив его с ".*" на ".*?". То же самое относится к совпадению после свойства href, оно должно быть не жадным или совпадать до конца последней ссылки в строке.

Символ . не соответствует разрывам строк, поэтому, если в коде ссылки или в тексте ссылки есть разрывы строк, ссылка не будет совпадать. Вы можете использовать [\W\w] вместо . для соответствия любому символу.

Таким образом, удаление обратной косой черты, нежелательные совпадения и разрешение разрывов строк сделают шаблон:

Pattern myPattern = Pattern.compile("<a[\\W\\w]*?href=[\"'](.*?)[\"'][\\W\\w]*?>([\\W\\w]*?)</a>", Pattern.CASE_INSENSITIVE);

Edit:
Я забыл избежать обратной косой черты в [\W\w] кодах в строке.

0 голосов
/ 01 мая 2009

Разве все совпадений с полным стопом / подстановочными символами не должны быть жадными?

<a.*?href=[\"'](.*?)[\"'].*?>(.*?)</a>

Я не Java-разработчик, поэтому я не знаю правил для шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...