2013-07-30 1 views
0

Я хочу, чтобы проверить URLs не заканчивается «.json» в Rails маршрутах файлРубин Regex не соответствует строке в конце строки

С $, мы можем соответствовать тому, что появляется в конце концов, но я не являюсь чтобы найти регулярное выражение, чтобы в конце не было строки.

Например,

xyz.com/xjsonx 
xyz.com/jsonx 
xyz.com/jso 

должен пройти

но

xyz.com/xxx.json 

не должны пройти.

Какое будет правильное регулярное выражение для этого?

+4

Вы пробовали что-нибудь? – ToastyMallows

+0

@ToastyMallows Да, я попробовал (json (?! $)), Но это не сработало – SpaceX

ответ

5

String#end_with? будет хорошим инструментом для перемещения.

ar = ['xyz.com/xjsonx','xyz.com/jsonx','xyz.com/jso','xyz.com/xxx.json'] 
ar.map{|e| e.end_with? '.json'} 
# => [false, false, false, true] 

ar = ['xyz.com/xjsonx','xyz.com/jsonx','xyz.com/jso','xyz.com/xxx.json'] 
ar.map{|e| [e,e.end_with?('.json')]} 
# => [["xyz.com/xjsonx", false], 
#  ["xyz.com/jsonx", false], 
#  ["xyz.com/jso", false], 
#  ["xyz.com/xxx.json", true]] 
+0

Большое спасибо @Babai, но, к сожалению, я не могу использовать этот экспресс в маршрутах Rails. – SpaceX

1

Вы можете использовать негативный метод опережения в этом сценарии:

^(.(?<!\.json))*?$ 

Я считаю, что это регулярное выражение может найти то, что вы хотите.

+0

Правильный ответ, но, возможно, вы можете поместить '' 'внутри негативного взгляда. Таким образом, он будет соответствовать только если строка не заканчивается на '.json', и что-то вроде' example.com/test.jsontest.html' может пройти. – pajaja

+0

Интересно, я пробовал регулярное выражение в большом количестве случаев, и он прошел все из них, включая ваш пример. – MurifoX

+1

Ну, если вы используете его в файле маршрутов, вам не нужны '^' и '$', так как они автоматически появляются в начале и в конце каждого правила.(по умолчанию Rails) – MurifoX

0

Вы можете использовать этот шаблон, которые выполняют только одну назад ':

(?i)\S++(?<!\.json) 

\S++ стендов для всех символов, которые не являются белыми символами (пробел, табуляция, символ новой строки) один или больше раз.

Но вы можете заменить его более явным описанием формата URL, если вам нужно.

(Однако Бабай путь, кажется, лучше всего, если вы не должны проверить формат URL)

Примечание: Я не добавлял якорь ^, так как я не знаю, если вы хотите проверять строки, содержащие только URL и ничего больше. Хотя это бесполезно, вы можете добавить якорь начала, чтобы сделать регулярное выражение более эффективным.

1

Я хотел бы сохранить его простым и будет использовать /\.json$/ с НЕ (!), чтобы полностью изменить результат теста:

%w[ 
    xyz.com/xjsonx 
    xyz.com/jsonx 
    xyz.com/jso 
    xyz.com/xxx.json 
].each do |s| 
    if !s[/\.json$/] 
    puts "#{s} passes" 
    else 
    puts "#{s} fails" 
    end 
end 
# >> xyz.com/xjsonx passes 
# >> xyz.com/jsonx passes 
# >> xyz.com/jso passes 
# >> xyz.com/xxx.json fails 

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

%w[ 
    xyz.com/xjsonx 
    xyz.com/jsonx 
    xyz.com/jso 
    xyz.com/xxx.json 
].each do |s| 
    if s[/\.json$/] 
    puts "#{s} fails" 
    else 
    puts "#{s} passes" 
    end 
end 
# >> xyz.com/xjsonx passes 
# >> xyz.com/jsonx passes 
# >> xyz.com/jso passes 
# >> xyz.com/xxx.json fails 
Смежные вопросы