루비 % r {} 표현식


131

모델에는 필드가 있습니다

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

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

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

답변:


254

%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

5
downvote는 1 시간 전이었습니다. 구분자로 공간에 관해서는, 이것은 굉장하지만 6 개월 후에 혼란스럽지 않고 코드를 읽을 수 있도록 명령하는 것은 아닙니다. :)
Eureka

3
공백을 구분 기호로 사용하는 경우 나중에 공백을 추가하면 정규식이 중단됩니다. 아이디어는 정규 표현식에서 일치하지 않는 구분 기호를 중괄호를 선호하는 기본값으로 사용하는 것입니다.
Steven Hirlston

1
마치 루비가 가능한 한 끔찍한 코드를 작성하도록 디자인 된 것 같습니다
Roman

두 번째 수정 사항을 이해하지 못합니다. 특별한 점은 무엇입니까 %r{}x? /.../x공백도 무시합니다. 이것은 특별한 %r구문 속성이 아닙니다 . 수행 /../할 수있는 모든 옵션 도 수행 할 수 있습니다 %r{}.
Mecki

9

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

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


% r {value}이 (가) / value /와 같습니까?
Alexandre

예, 동일합니다. - 예 %w[1 2 3]와 동일 [1, 2, 3]합니다.
Samy Dindane

6
%w[1 2 3]입니다 하지 같은 [1, 2, 3]. 와 동일합니다 ['1', '2', '3'].
Jörg W Mittag

@ JörgWMittag 수정 해 주셔서 감사합니다.
Samy Dindane

9

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

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

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


3

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

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

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

1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.