수색…


이름이 지정된 그룹.

Ruby는 표준 그룹 구문 (...) 을 명명 된 그룹 (?<name>...) 합니다. 이렇게하면 그룹 수를 세는 대신 이름으로 추출 할 수 있습니다.

name_reg = /h(i|ello), my name is (?<name>.*)/i #i means case insensitive

name_input = "Hi, my name is Zaphod Beeblebrox"

match_data = name_reg.match(name_input) #returns either a MatchData object or nil
match_data = name_input.match(name_reg) #works either way

if match_data.nil? #Always check for nil! Common error.
  puts "No match"
else
  match[0] #=> "Hi, my name is Zaphod Beeblebrox"
  match[1] #=> "i" #the first group, (i|ello)
  match[2] #=> "Zaphod Beeblebrox"
  #Because it was a named group, we can get it by name
  match[:name]  #=> "Zaphod Beeblebrox"
  match["name"] #=> "Zaphod Beeblebrox"
  puts "Hello #{match[:name]}!"
end

일치 항목의 인덱스는 왼쪽 괄호의 순서에 따라 계산됩니다 (전체 정규식이 인덱스 0의 첫 번째 그룹 임).

reg = /(((a)b)c)(d)/
match = reg.match 'abcd'
match[0] #=> "abcd"
match[1] #=> "abc"
match[2] #=> "ab"
match[3] #=> "a"
match[4] #=> "d"

= ~ 연산자

if /hay/ =~ 'haystack'
  puts "There is hay in the word haystack"
end

참고 : 주문 은 중요 합니다. 'haystack' =~ /hay/ 는 대부분의 경우 동등하지만 부작용이 다를 수 있습니다.

  • 명명 된 캡처 그룹에서 캡처 된 문자열은 Regexp#=~ 이 호출 될 때만 로컬 변수에 할당됩니다 ( regexp =~ str ).
  • 오른쪽 피연산자는 임의의 객체이므로 regexp =~ str 대해서는 Regexp#=~ 또는 String#=~ 중 하나라고합니다.

이것은 참 / 거짓 값을 반환하지 않고, 일치하는 경우 색인을 반환하거나 찾지 못하면 nil을 반환합니다. 루비의 모든 정수는 진리 (0 포함)이며 nil은 위선이므로이 방법이 효과적입니다. 부울 값을 원하면 다른 예제 에서와 같이 #=== 를 사용하십시오.

한정 기호

수량자를 사용하면 반복되는 문자열의 수를 지정할 수 있습니다.

  • 0 또는 1 :

    /a?/
    
  • 0 또는 다수 :

    /a*/
    
  • 하나 또는 다수 :

    /a+/
    
  • 정확한 숫자 :

    /a{2,4}/ # Two, three or four
    /a{2,}/  # Two or more
    /a{,4}/  # Less than four (including zero)
    

기본적으로 한정 기호는 욕심이 많습니다. 즉, 여전히 일치하는 동안 많은 문자를 사용할 수 있습니다. 일반적으로 이것은 눈에 띄지 않습니다.

/(?<site>.*) Stack Exchange/ =~ 'Motor Vehicle Maintenance & Repair Stack Exchange'

명명 된 캡처 그룹 site 는 예상대로 '자동차 정비 및 수리'로 설정됩니다. 그러나 'Stack Exchange'가 문자열의 선택적 부분 인 경우 ( '스택 오버플로'가 될 수 있기 때문에) 순진한 솔루션이 예상대로 작동하지 않습니다.

/(?<site>.*)( Stack Exchange)?/

이 버전은 여전히 ​​일치하지만 이름을 붙인 캡처는 * 문자를 탐욕스럽게 먹기 때문에 '스택 익스체인지'를 포함합니다. 해결 방법은 * lazy를 만들기 위해 또 다른 물음표를 추가하는 것입니다.

/(?<site>.*?)( Stack Exchange)?/

추가 ? 어떤 양의 값을 매길지라도 게으르 게 만듭니다.

문자 클래스

기호의 범위를 설명합니다.

기호를 명시 적으로 열거 할 수 있습니다.

/[abc]/ # 'a' or 'b' or 'c'

또는 범위 사용

/[a-z]/ # from 'a' to 'z'

범위와 단일 기호를 결합 할 수 있습니다.

/[a-cz]/ # 'a' or 'b' or 'c' or 'z'

선행 대시 ( - )는 charachter로 취급됩니다.

/[-a-c]/ # '-' or 'a' or 'b' or 'c'

선행하는 기호가 ^

/[^a-c]/ # Not 'a', 'b' or 'c'

널리 쓰이는 클래스와 특수 문자, 그리고 라인 엔딩에 대한 몇 가지 단축키가 있습니다.

^  # Start of line
$  # End of line
\A # Start of string
\Z # End of string, excluding any new line at the end of string
\z # End of string
.  # Any single character
\s # Any whitespace character
\S # Any non-whitespace character
\d # Any digit
\D # Any non-digit
\w # Any word character (letter, number, underscore)
\W # Any non-word character
\b # Any word boundary

\n 은 단순히 새로운 줄로 이해할 것입니다.

/ 또는 [] 와 같은 예약 된 문자를 이스케이프하려면 백 슬래시 (왼쪽 슬래시)를 사용하고,

\\ # => \
\[\] # => []

사례문의 정규 표현식

switch 문을 사용하여 문자열이 여러 정규 표현식과 일치하는지 테스트 할 수 있습니다.

case "Ruby is #1!"
when /\APython/
    puts "Boooo."
when /\ARuby/
    puts "You are right."
else 
    puts "Sorry, I didn't understand that."
end

이는 case 문이 == 연산자가 아닌 === 연산자를 사용하여 동일성이 검사되기 때문에 작동합니다. 정규식이 === 사용하여 비교의 왼쪽에있을 때 문자열이 일치하는지 확인합니다.

정규 표현식 정의하기

Regexp는 Ruby에서 세 가지 다른 방법으로 만들 수 있습니다.

  • 슬래시 사용 : / /

  • %r{}

  • Regex.new 사용

    #The following forms are equivalent
    regexp_slash = /hello/
    regexp_bracket = %r{hello}
    regexp_new = Regexp.new('hello')
    
    string_to_match = "hello world!"
    
    #All of these will return a truthy value
    string_to_match =~ regexp_slash    # => 0
    string_to_match =~ regexp_bracket  # => 0
    string_to_match =~ regexp_new      # => 0
    

시합? - 부울 결과

true 또는 false 반환 true . 이는 $~ 및 기타 관련 변수를 업데이트하지 않고 regexp가 일치하는지 여부를 나타냅니다. 두 번째 매개 변수가 있으면 검색을 시작할 문자열의 위치를 ​​지정합니다.

/R.../.match?("Ruby")    #=> true
/R.../.match?("Ruby", 1) #=> false
/P.../.match?("Ruby")    #=> false

Ruby 2.4 이상

일반적인 빠른 사용법

정규 표현식은 다른 문자열이 있는지 검사하거나 문자열을 검색 및 / 또는 교체하기 위해 매개 변수로 메소드에서 자주 사용됩니다.

다음과 같은 항목을 자주 보게됩니다.

string = "My not so long string"
string[/so/] # gives so
string[/present/] # gives nil
string[/present/].nil? # gives true

따라서 문자열에 하위 문자열이 포함되어 있는지 확인하기 만하면됩니다.

puts "found" if string[/so/]

더 고급이지만 여전히 짧고 빠름 : 두 번째 매개 변수를 사용하여 특정 그룹을 검색합니다.이 예제에서 번호 매기기는 0이 아닌 1에서 시작하기 때문에이 예제에서는 두 번째입니다. 그룹은 괄호로 묶인 것입니다.

string[/(n.t).+(l.ng)/, 2] # gives long

또한 자주 사용됩니다 : sub 또는 gsub 검색하고 gsub . \1 은 처음 발견 된 그룹을 제공하고 \2 는 두 번째 :

string.gsub(/(n.t).+(l.ng)/, '\1 very \2') # My not very long string

마지막 결과가 기억되어 다음 행에 사용될 수 있습니다.

$2 # gives long


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow