Вы говорите, что уже извлекли тег <img>
и работаете с ним как с отдельной строкой. Это делает работу проще, но все еще есть много сложностей, с которыми приходится иметь дело. Например, как бы вы справились с этим тегом?
<img foosrc="whatever" barclass=noclass src =
folder/img.jpg class ='ho hum' ></img>
Здесь у вас есть:
- более одного пробела после имени тега
- атрибуты, имена которых только оканчиваются на
src
и class
- перевод строки вместо пробела после второго
=
- более одного пробела между именем атрибута и
=
- одинарные кавычки вместо двойных кавычек вокруг значения атрибута
- без окончательного
/
, поскольку автор использовал старый тег изображения в стиле HTML с закрывающим тегом, а не самозакрывающийся тег в стиле XML.
... и все это так же верно, как и приведенные вами примеры тегов. Может быть, вы знаете, что вам никогда не придется иметь дело с этими проблемами, но мы этого не делаем. Если мы предоставим вам регулярное выражение, адаптированное к вашим образцам данных, даже не упоминая эти другие проблемы, мы действительно поможем вам? Или помогать другим с похожими проблемами, которые случайно нашли эту страницу?
Ей ты тогда иди:
String[] tags = { "<img src = \"the source\" class=class01 />",
"<img class=class02 src=folder/img02.jpg />",
"<img class= \"class03\" / >",
"<img foosrc=\"whatever\" barclass=noclass" +
" class='class04' src =\nfolder/img04.jpg></img>" };
String regex =
"(?i)\\s+(src|class)\\s*=\\s*(?:\"([^\"]+)\"|'([^']+)'|(\\S+?)(?=\\s|/?\\s*>))";
Pattern p = Pattern.compile(regex);
int n = 1;
for (String tag : tags)
{
System.out.printf("%ntag %d: %s%n", n++, tag);
Matcher m = p.matcher(tag);
while (m.find())
{
System.out.printf("%8s: %s%n", m.group(1),
m.start(2) != -1 ? m.group(2) :
m.start(3) != -1 ? m.group(3) :
m.group(4));
}
}
выход:
tag 1: <img src = "the source" class=class01 />
src: the source
class: class01
tag 2: <img class=class02 src=folder/img02.jpg />
class: class02
src: folder/img02.jpg
tag 3: <img class= "class03" / >
class: class03
tag 4: <img foosrc="whatever" barclass=noclass class='class04' src =
folder/img04.jpg></img>
class: class04
src: folder/img04.jpg
Вот более читаемая форма регулярного выражения:
(?ix) # ignore-case and free-spacing modes
\s+ # leading \s+ ensures we match the whole name
(src|class) # the attribute name is stored in group1
\s*=\s* # \s* = any number of any whitespace
(?: # the attribute value, which may be...
"([^"]+)" # double-quoted (group 2)
| '([^']+)' # single-quoted (group 3)
| (\S+?)(?=\s|/?\s*>) # or not quoted (group 4)
)