У меня есть строки:
background: url('../../footer/right.png') repeat;
background: url("../../footer/left.png") repeat;
И я хочу извлечь только URL-адрес следующим образом:
../../footer/right.png
../../footer/left.png
Мои RegExps пока
.*?[(\'|(\"|(|\'|\"](.*?)[\"|\'|)|\")|\')].*?
[[\\(\']([^\']*?)[\'\\)]]|[\\(\"]([^\"]*?)[\"\\)]|[\\(]([^)]*?)[\\)]|[\']([^\']*?)[\']|[\"]([^\"]*?)[\"]
Но мне все это дано
background: url../../footer/izquierdo.png repeat;
Почему он делает это и каков правильный шаблон?
редактировать
Я пришел с ответом с вашей помощью, но я не знаю, почему он работает
(?<=\\(|\'|\")(.*?)(?=\'|\"|\\))
Любой знает, почему он может соответствовать любым комбинациям (
("
('
'
"
?
И BTW, эти совпадения верны для моей логики (я не упоминаю об этом раньше, но они делают)
Спасибо всем за помощь
Как об использовании чего-то вроде
\\(('|\")(.*?)\\1\\)
или даже добавить url
до
url\\(('|\")(.*?)\\1\\)
\\1
представляет совпадение из группы 1, которая может быть только '
или "
. Точка в использовании здесь заключается в том, чтобы убедиться, что мы имеем такую же цитату после и перед скобкой.
Это регулярное выражение поместит часть ../../footer/right.png
в группу 2, так что вы можете просто получить ее с помощью matcher.group(2)
.
Пример:
String data = "background: url('../../footer/right.png') repeat;\r\n" +
"\r\n" +
"background: url(\"../../footer/left.png\") repeat;";
Pattern p = Pattern.compile("\\(('|\")(.*?)\\1\\)");
Matcher m = p.matcher(data);
while (m.find())
System.out.println(m.group(2));
Вывод:
../../footer/right.png
../../footer/left.png
Глядя на эту часть вашего регулярного выражения:
[('|("|(|'|"]
(Я удалил обратную косую черту, которая вам нужна в строковом литерале Java.) Когда у вас есть набор символов, заключенный в []
в регулярном выражении, эффект должен соответствовать одному символу, который должен быть в наборе. Таким образом, [abc]
соответствует одному символу, который может быть либо 'a'
, 'b'
, либо 'c'
. Он никогда не соответствует последовательности более одного символа. Существуют и другие функции, например, используя ^
поскольку первый символ означает совпадение с символом не в наборе, и есть способы указать целые классы символов, такие как \d
для цифры.
Однако, похоже, вы пытаетесь использовать его для соответствия последовательности с несколькими символами, то есть вы ищете ('
или ("
в строке ". Вы не можете использовать конструкцию []
для этого. "Он написал это, он будет соответствовать одному символу, который либо (
, '
, |
, или "
.
Попробуйте использовать String.split()
String urlStr = "background: url('../../footer/right.png') repeat;";
String url = urlStr.split("'")[1];
System.out.println(url);
вывод
../../footer/right.png
Попробуй это:
url\([\'|\"](.+)[\'|\"]\)
поскольку строка Java будет:
"url\\([\\'|\\\"](.+)[\\'|\\\"]\\)"
Вы можете использовать (добавляя escape для цитаты там, где они вам нужны)
(?|'([^']*)'|"([^"]*)")
Ваш ответ будет в первой захваченной группе (благодаря (?|...|...)
, используемому для сброса индекса групп захвата)
\"
в вашем regx :-)