[ruby-on-rails] 루비 % r {} 표현식

모델에는 필드가 있습니다

validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i

나에게는 꽤 이상해 보인다. 나는 이것이 정규 표현식이라는 것을 알고 있습니다. 그러나 나는 원합니다 :

  • 그것이 무엇을 의미하는지 아는 것. 가 %r{value}동일 /value/?
  • 일반 Ruby 정규식 연산자 /some regex/또는 로 대체 할 수 있습니다 ~=. 가능합니까?


답변

%r{}/.../표기법 과 동일 하지만 정규 표현식에서 이스케이프하지 않고 ‘/’를 가질 수 있습니다.

%r{/home/user}

다음과 같습니다.

/\/home\/user/

이것은 가독성을 위해 구문 상품 일뿐입니다.

편집하다:

‘{}’대신 알파벳이 아닌 문자 쌍을 거의 모두 사용할 수 있습니다. 이러한 변형은 다음과 같이 작동합니다.

%r!/home/user!
%r'/home/user'
%r(/home/user)

편집 2 :

참고 그 %r{}x복잡한 regexps ‘에 더 읽기 만들기 공백, 변형 무시합니다. GitHub의 Ruby 스타일 가이드의 예 :

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x


답변

\.=>는 점을 포함하고
(gif|jpg|jpeg|png)=> 그런 다음 확장 중 하나
$=> 끝, 그 뒤에 아무것도
i=> 대소 문자 구분 안 함

그리고 쓰는 것과 같습니다 /\.(gif|jpg|jpeg|png)$/i.


답변

을 사용하면 %r모든 구분 기호를 사용할 수 있습니다.

당신은 사용할 수 있습니다 %r{}또는 %r[]또는 %r!!

다른 델리 미터를 사용하면 /일반 정규 표현식 리터럴에서 이스케이프 처리 할 필요가 없습니다 .


답변

이 정규 표현식은 .gif, .jpg로 끝나는 모든 문자열과 일치합니다.

당신은 그것을 대체 할 수 있습니다

/\.(gif|jpg|jpeg|png)$/i


답변

그것은 점과 gif, jpg, jpeg 또는 png 중 하나로 image_file_name끝나야 한다는 것을 의미 합니다 $.

예, %r{}정확히 동일 //하지만 %r{}탈출 할 필요는 없습니다 /.


답변