익스프레션 - Ruby:부울 정규 표현식의 올바른 구문은 무엇입니까?



레귤러 익스프레션 (6)

어떤 문자열을 패턴으로 검사하고 정규 표현식이 일치하면 true 또는 false를 반환하는 메서드의 올바른 구문은 무엇입니까?

기본 아이디어 :

def has_regex?(string)
    pattern = /something/i
    return string =~ pattern
end

사용 사례 :

if has_regex?("something")
    # woohoo
else
    # nothing found: panic!
end

https://src-bin.com



Answer #2

Ruby> = 2.4 또는 Rails의 경우 다음을 수행 할 수 있습니다.

 regexp.match?(string)

Answer #3

누구든지 나중에 참조 할 수 있도록 bbatsov의 루비 스타일 가이드 에서 이중 앞머리가 눈살을 찌푸리게합니다. double bang을 사용하는 대신 값 nil 이 아닌지 확인하십시오. 값이 nil이 아니면 존재하지 않습니다.

대신 이렇게 :

def has_regex?(string)
  !!(string =~ /something/i)
end

당신은 언제나 이것을 할 수 있습니다 :

def has_regex?(string)
  !(string =~ /something/i).nil?
end

Answer #4

당신이 말한 질문에서 :

... 패턴에 대한 문자열을 검사하고 정규 표현식이 일치하면 true 또는 false를 반환하는 메서드

johannes 지적했듯이 String=~ 은 패턴이 일치하지 않으면 nil 반환하고 일치하는 단어가 그렇지 않은 경우 문자열의 위치를 ​​반환합니다. 더 나아가서 그는 루비에서 nilfalse 제외한 모든 것은 true 와 같다고 말합니다. 이 모든 것이 옳다.

그러나, 그들은 정확하게 true 또는 false 이 아닙니다. 따라서 마지막 단계는 값을 Boolean 값으로 강제 변환하는 것입니다. 이것은 double bangs로 결과를 래핑하면 true 반환 true .

def has_regex?(string)
    !!(string =~ /something/i)
end

Answer #5

코드는 괜찮아 보이지만 더 작게 작성할 수도 있습니다.

String#=~ 의 반환 값은 다음과 같이 동작합니다.

  • 패턴이 일치하지 않으면 nil
  • 일치하는 단어가 시작된 문자열의 위치

Ruby에서 nilfalse 제외한 모든 것은 조건문에서 true 와 같이 동작하므로 쓰기 만하면됩니다.

if string=~ pattern
  # do something
else
  # panic
end

Answer #6

특정 프로젝트에만 국한되지 않고 일반적으로이 작업을 원했기 때문에 환경을 전혀 수정하지 않으려 고합니다.

조건 match 로 정상 match 메서드의 반환 값을 사용하여 작업을 수행 할 수있었습니다. 이 샘플 문자열에서 양수 및 음수 모두를 테스트했습니다.

irb(main):014:0> if "123".match(/.2./); puts "worked"; end
worked
=> nil
irb(main):015:0> if "123".match(/.3./); puts "worked"; end
=> nil




syntax