Ruby Language
정규식 및 정규식 기반 조작
수색…
이름이 지정된 그룹.
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