我正在尝试更新CSS字符串中的所有网址,而我的正则表达式似乎只是第一个。我希望得到类似的东西:
url("file")
url('file');
url(file);
我还想排除网址为数据的内容:
url("data: ...");
url('data: ...');
url(data: ...);
我写了一些代码来做这件事,但它只取代了第一个:
String str = ".ff0{font-family:sans-serif;visibility:hidden;}@font-face{font-family:ff1;src:url(f1.woff)format(\"woff\");}.ff1{font-family:ff1;line-height:1.330566;font-style:normal;font-weight:normal;visibility:visible;}@font-face{font-family:ff2;src:url(f2.woff)format(\"woff\");}.ff2{font-family:ff2;line-height:1.313477;font-style:normal;font-weight:normal;visibility:visible;}@font-face{font-family:ff3;src:url(f3.woff)format(\"woff\");}.ff3{font-family:ff3;line-height:1.386719;font-style:normal;font-weight:normal;visibility:visible;}@font-face{font-family:ff4;src:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSIjOWU5ZTllIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDVMNSAwWk02IDRMNCA2Wk0tMSAxTDEgLTFaIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMSI+PC9wYXRoPgo8L3N2Zz4=)format(\"woff\");";
str = str.replaceAll("url\\((['\"]?)(?!data)(.*)\\1\\)","url(someURL/$2)");
out.println(str);
有关如何修复的任何想法?我想它与正则表达式有关。
答案 0 :(得分:3)
您可能希望使用非贪婪量词(*?
而不是*
)。
要正确排除data
条目,还可以使用占有量词来捕获qoutes:?+
而不是?
。
所以你的正则表达式看起来如下:
url\((['"]?+)(?!data)(.*?)\1\)
请注意,您应该像在示例中那样使用额外的斜杠来转义某些字符。
答案 1 :(得分:2)
你的.*
贪婪。它捕获到字符串的末尾。而是使用.*?
,这会强制引擎捕获尽可能少的字符。
str = str.replaceAll("url\\((['\"]?)(?!data)(.*?)\\1\\)","url(someURL/$2)");
答案 2 :(得分:0)
这样的事情应该有效:
Task.Run