(Java)RegEx从CSS获取URL?

我正在解析CSS以获取链接样式表中的URL。 这是一个Java应用程序。 ( 我尝试使用CSSParser( http://cssparser.sourceforge.net/ ),然而,它在解析时会默默地删除许多规则。

所以我只是使用正则表达式。 我想要一个正则表达式,它只能获取URL,并且足够强大,可以处理来自野外的真实css:

background-image: url('test/test.gif'); background: url("test2/test2.gif"); background-image: url(test3/test3.gif); background: url ( test4/ test4.gif ); background: url( " test5/test5.gif" ); 

你明白了。 这是Java的正则表达式实现( 不是我最喜欢的 )。

正则表达式的问题在于它们有时候太严格了。 如果您向我们展示了您目前非完美工作的正则表达式,我本可以为您提供更多帮助。

第一条评论:浏览器倾向于容忍大多数 HTML / CSS错误(不是JavaScript,这是一种编程而不是标记语言)。

你可以从background(-image)?开始background(-image)? 令牌锁定第一部分。 如何进行? 非常困难…

你总是有冒号,所以你可以添加到令牌的常量部分,然后从你的例子(而不是CSS规范)判断一个可变数量的空格,然后是url令牌。 可变数量的空格是[\w]* ,这成为我们正则表达式的一部分。

我用RegexBuddy尝试过这个

 background(-image)?: url[\s]*\([\s]*(?[^\)]*)\); 

不幸的是,它捕获了URL中的空格

 Matched text: background-image: url('test/test.gif'); Match offset: 0 Match length: 39 Backreference 1: -image Backreference 1 offset: 10 Backreference 1 length: 6 Backreference 2: 'test/test.gif' Backreference 2 offset: 22 Backreference 2 length: 15 Matched text: background: url ( test4/ test4.gif ); Match offset: 119 Match length: 39 Backreference 1: Backreference 1 offset: -1 Backreference 1 length: 0 Backreference 2: test4/ test4.gif Backreference 2 offset: 138 Backreference 2 length: 18 

因此,当您获得此URL时,您必须修剪字符串。 我不能从例子4中排除url组中的空格,但是,它应该匹配一个带有空格的URL,如果你没有%20test4.gif这个例子应该是正确的%20test4.gif文件

[编辑]我更喜欢以下版本的正则表达式

 background(-image)?: url[\s]*\([\s]*(?[^\)]*)[\s]*\)[\s]*; 

它容忍更多的空格

你可以只使用正则表达式吗? 如果使用字符串函数删除所有空格,那么你的生活可以变得如此简单,那么你就可以编写一个不必担心空白的正则表达式。

这是一个快速的,可能不会很好:

background(-image)?:url\(["']?(.*)["']?\);

第二个捕获组应该给你你想要的东西。

.*应该替换为包含有效路径可以包含的所有字符的字符类。

正则表达式真的很难维护。 我建议你看看SAC:

http://www.w3.org/Style/CSS/SAC/Overview.en.html