RegExp для перехвата текста между скобками и / или кавычками

1

У меня есть строки:

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, эти совпадения верны для моей логики (я не упоминаю об этом раньше, но они делают)

Спасибо всем за помощь

Теги:

5 ответов

1
Лучший ответ

Как об использовании чего-то вроде

\\(('|\")(.*?)\\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
  • 0
    Вы должны использовать \" в вашем regx :-)
  • 0
    @SabujHassan Woops, спасибо за указание на это :) Обновлено.
Показать ещё 3 комментария
0

Глядя на эту часть вашего регулярного выражения:

[('|("|(|'|"]

(Я удалил обратную косую черту, которая вам нужна в строковом литерале Java.) Когда у вас есть набор символов, заключенный в [] в регулярном выражении, эффект должен соответствовать одному символу, который должен быть в наборе. Таким образом, [abc] соответствует одному символу, который может быть либо 'a', 'b', либо 'c'. Он никогда не соответствует последовательности более одного символа. Существуют и другие функции, например, используя ^ поскольку первый символ означает совпадение с символом не в наборе, и есть способы указать целые классы символов, такие как \d для цифры.

Однако, похоже, вы пытаетесь использовать его для соответствия последовательности с несколькими символами, то есть вы ищете (' или (" в строке ". Вы не можете использовать конструкцию [] для этого. "Он написал это, он будет соответствовать одному символу, который либо (, ', |, или ".

  • 0
    Спасибо, это очень помогает
0

Попробуйте использовать String.split()

String urlStr = "background: url('../../footer/right.png') repeat;";
String url = urlStr.split("'")[1];
System.out.println(url);

вывод

../../footer/right.png
  • 0
    Я пробовал это раньше, это сработало, но я должен сделать if-else для всех комбинаций (('("Спасибо, все равно
0

Попробуй это:

url\([\'|\"](.+)[\'|\"]\)

поскольку строка Java будет:

"url\\([\\'|\\\"](.+)[\\'|\\\"]\\)"
0

Вы можете использовать (добавляя escape для цитаты там, где они вам нужны)

(?|'([^']*)'|"([^"]*)")

Ваш ответ будет в первой захваченной группе (благодаря (?|...|...), используемому для сброса индекса групп захвата)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню