2013-03-23 3 views
2

Я использую YUI3 library и использую filter для соответствия и замены частей URL.Regex, если существует подстрока, соответствует другой части строки

Поскольку фильтр не очень гибкий, я только в состоянии обеспечить регулярное выражение для поиска, а затем строку для замены матчей:

filter: { 
    searchExp : "-min\\.js", 
    replaceStr: "-debug.js" 
} 

В моем случае, у меня есть URL-адрес, который выглядит следующим образом :

http://site.com/assets/js?yui-3.9.0/widget-base/assets/skins/sam/widget-base.css&yui-3.9.0/cssbutton/cssbutton-min.css 

Я хотел бы, чтобы соответствовать /assets/js, если есть .css файлы. Если параметры содержат файл CSS, то он всегда будет содержать только файлы CSS.

До сих пор, я написал небольшое регулярное выражение для проверки наличия .css в самом конце:

.*\.css$ 

Однако теперь, если у нас есть матч, я хотел бы вернуться /assets/js как совпадение. Это что-то, что можно сделать с регулярным выражением?

Лично я бы предпочел, чтобы это выполнялось с помощью простой функции и простого if/else, но из-за ограничений (я могу использовать только регулярное выражение) мне нужно найти решение для регулярного выражения.

+0

AFAIK это не возможно только с помощью регулярных выражений –

+0

Вы хотите, чтобы вернуться только «/ активы/JS», если файл CSS найден (любой или конкретный один) или вы хотите вернуть что-то еще? –

+0

@Christian P. Да, я хотел бы вернуть '/ assets/js', если CSS найден :) – F21

ответ

0

Это немного взломан вместе, но должны делать эту работу:

var t = new RegExp("/assets/js(([^\\.]*\\.)*[^\\.]*\\.css)$") 

document.write("http://site.com/assets/js?yui-3.9.0/widget-base/assets/skins/sam/widget-base.css&yui-3.9.0/cssbutton/cssbutton-min.css".replace(t, "/newthing/$1")); 

По существу, он ищет /assets/js, после чего любых символов, а затем .css. Если все это соответствует ему, замените его новым текстом и включите соответствующий шаблон (из первых скобок) после него. Все, начиная с /assets, не входит в игру, поэтому его не нужно включать.

Я полагаю, что ваша библиотека использует replace внутренне, поэтому эти строки должны работать. В частности,

"/assets/js(([^\\.]*\\.)*[^\\.]*\\.css)$" 
"/newthing/$1" 

Я не совсем уверен, что вы хотите делать с результатами, но это позволяет изменить папку и добавьте суффиксы (а также проверку на наличие обоих маркеров в первую очередь). Чтобы добавить суффикс изменить замену следующим образом:

"/assets/js$1-mysuffix" 
+0

Это сделало трюк. :) Спасибо за отличное объяснение :) – F21

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