javascript正则表达式单行

Posted

技术标签:

【中文标题】javascript正则表达式单行【英文标题】:javascript regex single-line 【发布时间】:2011-05-09 12:01:40 【问题描述】:

我正在尝试将所有 @import 字符串替换为一个字符串,例如

var str = 'buttons .reprintheight:56px;background-position:-47px -1496px;@import "../common/buttons.css";@import "../screen/screen-1.css";@import "../screen/screen-2.css";@import "../screen/screen-3.css";@import "../screen/screen-5.css";@import "../screen/screen-6.css";@import "../screen/screen-7.css";@import "../screen/screen-quick-messages.css";@import "../screen/reset-password.css";#xml-datadisplay:none;bodyfont-family:"Helvetica Neue",HelveticaNeue,Helvetica-Neue,Helvetica,sans-serif;ulpadding:0;body,sectionwidth:768px;';

如果我写,它会起作用:

console.log(str.match(/@import\ /g));

但是如何在单行中指定所有 @import 声明,例如@import "../screen/screen-1.css";

console.log(str.match(/@import\ .+;/g));

没用。

【问题讨论】:

你想用什么替换导入? 至于你的.+“没用”,我能想到的“没用”的类型是匹配太多了,因为+是贪心的,意思是它将转到它找到的最后一个分号。将 ? 添加到量词使其变得非贪婪 - 所以 /@import\ .+?;/g 会起作用。但是您可能会在 URL 中使用分号,因此 Tim 的回答显然要好得多。只是想解释一下出了什么问题,以防下次有帮助。但要尽可能具体,这样可以避免错误。 【参考方案1】:

如果我错了,请纠正我,但似乎 @import 总是采用这种格式:

@import(空格)(引号)(一个或多个非引号字符)(引号)(分号)

如果是这样,那么让我们相应地构建正则表达式:

 /@import\s*"[^"]+";/

这应该分别匹配每个@import 语句。

【讨论】:

我认为somethingkindawierd给出的解决方案更笼统,值得标记为答案。 @Roboblob:可能是这样(尽管亚历克斯似乎不同意),但为什么这是对我的答案投反对票的理由?【参考方案2】:

我知道它已经回答了,但我只想提供上述模式的更简单版本。

我需要这个正则表达式来从我合并在一起的 css 文件中删除 @import 语句。

匹配模式:

@import (anything NOT a semicolon) (semicolon)

效果很好。这是我如何使用它的示例:

// $mergedStyles set earlier in script...

// matches the pattern 
// ["@import"]+[anything NOT a semicolon]+semicolon
// e.g.: "@import url("stuff");
$pattern = '/@import[^;]*;/';
$mergedStyles = preg_replace($pattern, '', $mergedStyles);

【讨论】:

感谢分享,我更喜欢这个解决方案,因为它更通用并且可以捕获更多@import 的变体。

以上是关于javascript正则表达式单行的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式删除单行 SQL 注释 (--)

用于匹配单行和多行注释的 Python 正则表达式。

单行电子邮件正则表达式有效,但多行版本无效

第三方库-正则re

正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)

将多个正则表达式匹配之一分配给变量作为 Perl 单行(取消引用数组?)