我有字符串:
background: url('../../footer/right.png') repeat;
background: url("../../footer/left.png") repeat;
我只想提取这样的 URL:
../../footer/right.png
../../footer/left.png
到目前为止我的正则表达式是
.*?[(\'|(\"|(|\'|\"](.*?)[\"|\'|)|\")|\')].*?
[[\\(\']([^\']*?)[\'\\)]]|[\\(\"]([^\"]*?)[\"\\)]|[\\(]([^)]*?)[\\)]|[\']([^\']*?)[\']|[\"]([^\"]*?)[\"]
但它一直给我
背景:url../../footer/izquierdo.png 重复;
为什么这样做以及正确的模式是什么?
编辑
在你的帮助下我找到了答案,但我不太知道为什么它有效
(?<=\\(|\'|\")(.*?)(?=\'|\"|\\))
任何人都知道为什么它可以匹配 (
("
('
'
"
的任意组合?
顺便说一句,这个匹配对我的逻辑来说是正确的(我没有提前提到,但他们确实这样做了)
感谢大家的帮助
最佳答案
使用类似的东西怎么样
\\(('|\")(.*?)\\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 - 用于捕获括号和/或引号之间的文本的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22413585/