2013-05-27 1 views
3

Я пытаюсь выяснить, как я могу сопоставить любое .css имя файла, а не начинать с подчеркивания, предшествующего любой строке. Я нашел хорошую отправную точку из этого вопроса на StackOverflow (ActiveAdmin assets precompile error):ruby ​​regex: соответствовать любому .css имени файла, не начинающему с подчеркивания, предшествующему любой строке

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

Однако это регулярное выражение соответствует только filename.css без подчеркивания. Я хотел бы иметь регулярное выражение, которое соответствует любому пути до имени файла без подчеркивания. Следующие строки должны соответствовать:

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

но следующие строки не должны совпадать:

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

Любая помощь будет оценена.

ответ

2

Что-то, как это должно работать:

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

Не все версии рубин поддерживают его, но вы Коула также попробуйте отрицательный прогноз:

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

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

+0

отрицательный взгляд не сработал для меня. Другой делает! Спасибо. – user2425395

+0

Вторая версия неверна. Результат поиска невозможен, потому что предыдущий '. +' Может просто совпадать с ним, если он захочет - косой чертой является необязательным. И первая версия не позволяет подчеркивать (или заглавную букву) где угодно в имени файла ... –

2

Это должно работать:

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

Объяснение:

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

Не могли бы вы указать мне хороший учебник, чтобы узнать 'Regex'? –

+0

Чтение и понимание http://www.regular-expressions.info/tutorial.html - отличное начало. Вы также можете использовать онлайн-инструменты для тестирования регулярного выражения, например http://regex101.com/, во время чтения учебника, в котором также рассказывается, что делает каждая часть регулярного выражения. – melwil

+0

Спасибо за помощь! :) –

1

Предполагая, что вход всегда путь к файлу, я предпочел бы сделать так:

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

Regexps трудно читать, и так, чтобы улучшить свой код читаемость - это хорошая идея использовать как можно меньше.

Кроме того, если вы делаете другие матчи, вы можете извлечь расширения файлов CSS в других регулярных выражениях, как

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

В зависимости от того, является ли это допустимым вариантом, это лучшее решение, чем любое регулярное выражение. – melwil

+0

Я не могу использовать это решение, потому что file_path - это неизвестный фактор в моем случае. Я должен предоставить регулярное выражение в этой форме: config.assets.precompile + = [/^[^_]\w+\.(css|css.scss)$/]. – user2425395

Смежные вопросы