Ruby 정규식을 여러 줄로 분할


82

이것은 당신이 기대하는 질문이 아닐 수도 있습니다! 줄 바꿈을 통해 일치하는 정규식을 원하지 않습니다. 대신 가독성을 위해 여러 줄의 코드로 나누고 싶은 긴 정규식을 작성하고 싶습니다.

다음과 같은 것 :

"bar" =~ /(foo|
           bar)/  # Doesn't work!
# => nil. Would like => 0

할 수 있습니까?

답변:



126

x 옵션과 함께 % r을 사용하는 것이 선호되는 방법입니다.

github ruby ​​스타일 가이드에서이 예제를 참조하세요.

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

regexp.match? "start groupalt2end"

https://github.com/github/rubocop-github/blob/master/STYLEGUIDE.md#regular-expressions


5
따라야 할 예. 정규식 내부의 주석은 유지 관리에 놀라운 역할을합니다.
Paul Cantrell

8
또는 % r 대신 /를 사용하면 rubocop이 정규식이 슬래시 사이에 있지 않으면 불평하기 때문입니다. 또한 다음과 같이 권장하는 스타일 가이드 : github.com/bbatsov/ruby-style-guide#regular-expressions
ytg

3

당신이 사용할 수있는:

"bar" =~ /(?x)foo|
         bar/

8
이 답변은 내 상황에 도움이되었지만 (? x)가 의미하는 바를 검색하고 더 많은 컨텍스트를 추가 할 수 있어야만합니다. 이 답변이 설명하는 내용에 대해 더 명확하게 업데이트되면 좋을 것입니다. 관심있는 다른 사람들을 위해 여기에서 (? on-off) 구성에 대한 메모가 도움이되는 것을 발견했습니다. ruby-doc.org/core-1.9.3/Regexp.html#class-Regexp-label-Options
Ben Parizek

@BenParizek 아마도 여기에 간단한 설명을 주석으로 추가 할 수 있습니까?
Peter Berg

나는이 주제에 대한 전문가는 아니지만 내가 이해하기 때문에 여기에있는 대부분의 답변은 같은 것을 다른 버전으로 말하고 있습니다. 문제는 복잡한 정규식을 읽기가 어렵다는 것입니다. 일반적인 대답은 다음과 같습니다. free-spacing 모드를 활성화하여 regexe를 더 읽기 쉽게 만들 수 있습니다. 자유 간격 모드를 활성화 할 수있는 다양한 방법이 있습니다. 1) 끝 구분 기호 뒤에 수정자를 추가 할 수 있습니다. /myregex/x2) (? on-off) 구문을 사용하여 자유 간격 모드를 전환 할 수 있습니다 /myregex(?x) with free spacing/. 3) %r{myregex}x구문을 사용할 수 있습니다 .
Ben Parizek

1

정규식 중간 표현을 자르는 대신 부분으로 나누는 것이 좋습니다.

full_rgx = /This is a message\. A phone number: \d{10}\. A timestamp: \d*?/

msg = /This is a message\./
phone = /A phone number: \d{10}\./
tstamp = /A timestamp: \d*?/

/#{msg} #{phone} #{tstamp}/

긴 문자열에 대해서도 똑같이합니다.


나는 모든 곳에 /x뿌려야했기 때문에 수정자를 추천하는 다른 사람들 보다이 대답을 사용했습니다 \s. 정규식을 분리하는 것은 훨씬 빠르고 읽기 및 유지 관리가 더 쉬웠습니다.
agressen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.