正则表达式捕获一切,包括两个模式之间的新行

时间:2012-12-11 08:52:36

标签: javascript regex

我正在尝试从样式表中提取@media规则进行缓存,然后在适当的分辨率下使用JS在IE< 9中应用。

例如:

.../*default rules*/...
#work-head { background-image: url("/images/work-art-supplies-med.png"); height: 168px; width: 213px; }        

}

@media screen and (min-width : 657px) {


.welcome h1 { border: 0; margin-bottom: 0; text-align: center; }

.welcome p { font-size: 13px; font-size: 1.3rem; }

.../*more rules*/...

}

.../*more rules*/...

目前我正在获得最小宽度及其后的所有内容(右侧到样式表的末尾):

/657px\)(\s|\n)*\{/

并通过在媒体查询结尾处找到双“}}”来获取媒体查询的结束点,并使用以下内容:

/}[^{]*}/

这很有效,但它需要两个正则表达式和一些字符串操作来制作每个IE样式表,这让我觉得很脏。

我试图避免将IE的规则分解为单独的文件以使维护更容易,我认为我需要一个正则表达式,以便我可以在CSS被压缩之前和之后提取(现在,但显然远离最优的)。

那么有人可以告诉我如何将这两个表达式合并为一个吗?

基本上:如何匹配文字或模式与另一个文字或模式之间的所有内容?

另外 - 这需要在IE< 9中工作,所以我认为前瞻和后瞻不是选项(?)

2 个答案:

答案 0 :(得分:1)

我忘记了这个问题:-),但万一有人感兴趣:

/657px\)(\s|\n)*\{(.|\n)+?(}[^{]*})/

诀窍(差不多)。它在http://regexpal.com/上完美运行,但在IE< 9中,匹配得到“}} ,,,}}”最后而不是“}}”。

无论如何我需要对其进行子串,所以没什么大不了的,但是我有兴趣听听是否有人知道如何让它在IE中以与regexpal相同的方式运行。

答案 1 :(得分:0)

如果您可以假设您想要的最后一行只是“}”,那么这样做:

 /657px\)[\n\r\w\s]*\{[\n\r\w\W]*[\n\r]\}/

我使用phantomjs在你的测试用例上运行下面的过滤器:

var fs = require('fs'),
input = fs.open('/dev/stdin', 'r');
var stuff = input.read();
var somestuff = stuff.match(/657px\)[\n\r\w\s]*\{[\w\W]*[\n\r]\}/);
console.log(somestuff);