ruby regex:匹配任何.css文件名,不以下划线开头,在任何字符串之前

时间:2013-05-27 14:56:51

标签: ruby regex expression

我正在试图找出如何在任何字符串之前匹配任何.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

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

这应该有效:

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

说明:

(.*?\/)?  # Means it accepts any characters upfront, ending with a slash, 
          # then the filename. The ? makes it optional.

答案 1 :(得分:2)

这样的事情应该有效:

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

并非所有ruby版本都支持它,但你也可以尝试使用负面预测:

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

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

答案 2 :(得分:1)

假设输入始终是文件路径,我宁愿这样做:

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

正则表达式难以阅读,因此为了提高代码可读性,最好尽可能少地使用它。

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

css_exts_regexp = /(css|scss|sass)/
 File.basename(file_path).match(/_.*#{css_exts_regxp}/)