3

我试图弄清楚如何匹配任何 .css 文件名,而不是以下划线开头,在任何字符串之前。我从这个关于 stackoverflow 的问题( ActiveAdmin assets precompile error )中找到了一个很好的起点:

[/^[^_]\w+\.(css|css.scss)$/]

但是,这个正则表达式只匹配没有下划线的 filename.css。我想要一个匹配文件名之前的任何路径的正则表达式,没有下划线。以下字符串应匹配:

mystyle.css
application.css.scss
/assets/stylesheets/application.css

但以下字符串不应匹配:

_mystyle.css
_application.css.scss
/assets/stylesheets/_application.css

任何帮助,将不胜感激。

4

3 回答 3

2

这应该有效:

/^(.*?\/)?[^_]\w*\.(css|css\.scss)$/

解释:

(.*?\/)?  # Means it accepts any characters upfront, ending with a slash, 
          # then the filename. The ? makes it optional.
于 2013-05-27T14:58:09.267 回答
2

像这样的东西应该工作:

/(.+\/|^)[a-z0-9\.]+\.s?css$/

并非所有 ruby​​ 版本都支持它,但您也可以尝试否定前瞻:

/.+\/?(?!_)\w+\.s?css$/

http://ruby-doc.org/core-2.0/Regexp.html#label-Anchors

于 2013-05-27T15:11:56.797 回答
1

假设输入总是一个文件路径,我宁愿这样做:

File.basename(file_path).match(/_.*(css|scss|sass)/)

正则表达式很难阅读,因此为了提高代码的可读性,尽量少用是个好主意。

此外,如果您正在进行其他匹配,您可能希望在其他正则表达式中提取 css 文件扩展名,例如

css_exts_regexp = /(css|scss|sass)/
 File.basename(file_path).match(/_.*#{css_exts_regxp}/)
于 2013-05-27T15:21:59.200 回答