Во-первых, я бы использовал метод group()
для получения сопоставленного текста, а не toString()
. Но, вероятно, вам нужна только часть URL, поэтому я бы использовал скобки для захвата этой части и вызова group(1)
ее получения.
Во-вторых, я бы не предположил, что src
был первым атрибутом в теге <img>
. Например, в SO ему обычно предшествует атрибут class
. Вы хотите добавить что-то, совпадающее с промежуточными атрибутами, но убедитесь, что оно не может совпадать после конца тега. [^<>]+
вероятно будет достаточно.
В-третьих, я бы использовал что-то более ограничительное, чем .*
, чтобы сопоставить неизвестную часть с путем. Всегда есть вероятность, что вы найдете два URL в одной строке, например:
<img src="http://so.com/foo.jpg"> blah <img src="http://so.com/bar.jpg">
В этом случае .*
в вашем регулярном выражении уменьшит разрыв, предоставив вам один матч там, где вы хотели два. Опять же, [^<>]*
, вероятно, будет достаточно ограничительным.
Есть также несколько других потенциальных проблем. Значения атрибутов всегда заключены в двойные кавычки, или они могут быть заключены в одинарные кавычки или вообще не заключены в кавычки? Будут ли пробелы вокруг =
? Имена элементов и атрибутов всегда строчные?
... и я мог бы продолжать. Как уже много раз указывалось здесь, на SO, регулярные выражения на самом деле не являются подходящим инструментом для работы с HTML. Обычно они могут выполнять простые задачи, подобные этой, но важно, чтобы вы понимали их ограничения.
Вот моя пересмотренная версия вашего регулярного выражения (в виде строкового литерала Java):
"(?i)<img[^<>]+src\\s*=\\s*[\"']?(http://stackoverflow\\.com/[^<>]+\\.jpg)"