루비 정규 표현식


정규식은 특수한 구문이 포함된 패턴을 사용하여 문자열 집합을 일치시키거나 찾는 특수 문자 시퀀스입니다.

정규 표현식은 미리 정의된 특정 문자와 이러한 특정 문자의 조합을 사용하여 "규칙 문자열"을 형성합니다. 이 "규칙 문자열"은 문자열에 대한 필터링 논리를 표현하는 데 사용됩니다.

Syntax

정규식은 문자 그대로 슬래시 사이 또는 %r 다음에 오는 구분 기호 사이의 패턴입니다. 예:

/pattern/
/pattern/im    # 可以指定选项
%r!/usr/local! # 使用分隔符的正则表达式

Example

#!/usr/bin/ruby

line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";

if ( line1 =~ /Cats(.*)/ )
  puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
  puts "Line2 contains  Dogs"
end


위 예제의 출력 결과는 다음과 같습니다. modifiers

정규식에는 문자 그대로 일치의 모든 측면을 제어하는 ​​선택적 수정자가 포함될 수 있습니다. 수정자는 위의 예에 표시된 것처럼 두 번째 슬래시 문자 뒤에 지정됩니다. 가능한 수정자는 아래 첨자에 나열됩니다.

수정자 ioxmu,e,s,n

문자열이 %Q로 구분되는 것처럼 Ruby에서는 %r과 그 뒤에 구분 기호를 사용하여 정규식을 시작할 수 있습니다. 이는 설명에 이스케이프하고 싶지 않은 슬래시 문자가 많이 포함되어 있을 때 유용합니다.

Line1 contains Cats

정규 표현식 패턴

제어 문자 (+ ? . * ^ $ ( ) [ ] { } | )를 제외하고 다른 모든 문자는 자체적으로 일치합니다. 제어 문자 앞에 백슬래시를 배치하면 제어 문자를 이스케이프할 수 있습니다.

다음 표에는 Ruby에서 사용할 수 있는 정규식 구문이 나열되어 있습니다.

설명
텍스트를 일치시킬 때 대/소문자를 무시합니다.
#{} 보간을 한 번만 실행하면 정규식이 처음으로 평가됩니다.
공백을 무시하여 표현식 전체에 공백과 주석을 허용합니다.
은 여러 줄과 일치하며 개행 문자를 일반 문자로 인식합니다.
정규식을 유니코드(UTF-8), EUC, SJIS 또는 ASCII로 해석합니다. 수정자를 지정하지 않으면 정규식은 소스 인코딩을 사용하는 것으로 간주됩니다.
패턴 설명
^ 줄의 시작 부분과 일치합니다.
$ 줄 끝과 일치합니다.
.은 줄 바꿈을 제외한 모든 단일 문자와 일치합니다. m 옵션을 사용하면 개행 문자와도 일치할 수 있습니다.
[...]은 대괄호 안의 단일 문자와 일치합니다.
[^...]은 대괄호 안에 있지 않은 모든 단일 문자와 일치합니다.
re* 이전 하위 표현식과 0회 이상 일치합니다.
re+은 이전 하위 표현식과 한 번 이상 일치합니다.
re? 이전 하위 표현식과 0번 또는 1번 일치합니다.
re{n}은 이전 하위 표현식과 n번 일치합니다.
re{n,} 이전 하위 표현식을 n번 이상 일치시킵니다.
re{ n, m} 이전 하위 표현식과 최소 n회, 최대 m회 일치합니다.
a|b는 a 또는 b와 일치합니다.
(re)정규 표현식을 그룹화하고 텍스트를 일치시키는 것을 기억하세요.
(?imx)정규식 내에서 i, m 또는 x 옵션을 일시적으로 켭니다. 괄호 안에 있으면 괄호 안의 부분만 영향을 받습니다.
(?-imx)정규 표현식 내에서 i, m 또는 x 옵션을 일시적으로 끕니다. 괄호 안에 있으면 괄호 안의 부분만 영향을 받습니다.
(?: re) 정규 표현식을 그룹화하지만 텍스트 일치를 기억하지 않습니다.
(?imx: re)괄호 안의 i, m, x 옵션을 일시적으로 켜세요.
(?-imx: re)괄호 안의 i, m, x 옵션을 일시적으로 끕니다.
(?#...)댓글.
(?= re)패턴을 사용하여 위치를 지정하세요. 범위가 없습니다.
(?! re)패턴의 부정을 이용하여 위치를 지정합니다. 범위가 없습니다.
(?> re)는 역추적 없이 독립 실행형 모드와 일치합니다.
w 단어 문자를 일치시킵니다.
W은 단어가 아닌 문자와 일치합니다.
s은 공백 문자와 일치합니다. [tnrf]와 동일합니다.
S은 공백이 아닌 문자와 일치합니다.
d 숫자를 맞춰보세요. [0-9]와 동일합니다.
D은 숫자가 아닌 숫자와 일치합니다.
A은 문자열의 시작과 일치합니다.
Z은 문자열의 끝과 일치합니다. 개행 문자가 존재하는 경우 개행 문자까지만 일치합니다.
z은 문자열의 끝과 일치합니다.
G 경기가 완료되는 마지막 지점을 맞춰보세요.
b 괄호 밖에 있으면 단어 경계를 일치시키고 괄호 안에 있으면 백스페이스(0x08)를 일치시킵니다.
B은 단어가 아닌 경계와 일치합니다.
n, t 등은 줄바꿈, 캐리지 리턴, 탭 등과 일치합니다.
1...9n번째 그룹화된 하위 표현식과 일치합니다.
10이미 일치하는 경우 그룹화된 n번째 하위 표현식을 일치시킵니다.그렇지 않으면 문자 인코딩의 8진수 표현을 가리킵니다.

정규식 예

Character

ExampleDescription
/ruby/match "ruby"
\ 엔 기호를 일치시킵니다. Ruby 1.9와 Ruby 1.8은 여러 문자를 지원합니다.

Character 클래스

InstanceDescription
/[Rr]uby/는 "Ruby" 또는 "ruby"와 일치
/rub[ye]/ 경기" ruby" 또는 "rube"
/[aeiou]/는 모든 소문자 모음과 일치합니다.
/[0-9]/은 모든 숫자와 일치하며 이는 /[0123456789]/
/[a-z]/는 모든 소문자 ASCII 문자와 일치합니다.
/[A-Z]/은 모든 대문자 ASCII 문자와 일치합니다.
/[a-zA-Z0-9]/ 일치 괄호 안의 모든 문자
/[^aeiou]/ 소문자 모음 문자가 아닌 모든 문자와 일치
/[^0-9]/ 숫자가 아닌 문자와 일치

특수 문자 클래스

에 해당하는 숫자가 아닌 값과 일치합니다.
InstanceDescription
/./줄 바꿈을 제외한 모든 문자와 일치
/./m여러 줄 모드에서는 개행 문자와도 일치할 수 있습니다.
/d/는 /[0-9]/
/D/에 해당하는 숫자와 일치하며 /[^0-9] /
/s/는 /[trnf]/
/S/에 해당하는 공백 문자와 일치하며 /[^trnf]/
/에 해당하는 공백이 아닌 문자와 일치합니다. w/ /[A-Za-z0-9_]/
/W/에 해당하는 단어 문자와 일치 /[^A-Za-z0-9_] /에 해당하는 비단어 문자와 일치

repeat

인스턴스 설명
/ruby?/은 "rub" 또는 "ruby"와 일치합니다. 그 중 y는 선택사항입니다.
/ruby*/는 "rub"에 0개 이상의 y를 더한 것과 일치합니다.
/ruby+/은 "rub"와 1개 이상의 y를 일치시킵니다.
/d{3}/은 정확히 3개의 숫자와 일치합니다.
/d{3,}/ 3개 이상의 숫자를 일치시킵니다.
/d{3,5}/ 3, 4 또는 5개의 숫자를 일치시킵니다.

Non-Greedy Repeat

최소 반복 횟수와 일치합니다.

InstanceDescription
/<.*>/탐욕스러운 중복: 일치 "<ruby>perl>"
/<.*?>/ Non-greedy 반복: "& lt; ruby ​​​​& gt; perl & gt;" "" & lt; ruby ​​​​& gt; 그룹화: + 반복 d
/(Dd)+/

: + Dd 일치 "Ruby", "Ruby, ruby, ruby" 등을 반복합니다. backreference 이전에 일치했던 그룹과 다시 일치합니다. Description는 Ruby&Rails 또는 Ruby&Rails작은따옴표 또는 큰따옴표 문자열입니다. 1은 첫 번째 그룹과 일치하는 문자와 일치하고, 2는 두 번째 그룹과 일치하는 문자와 일치합니다.
Instance
/([Rr])uby&1ails/
/(['"])(?:(?!1).)*1과 일치합니다. /

Example

Description
/ruby|rube /"ruby" 또는 "rube"와 일치
/rub(y|le))/"ruby" 또는 "ruble"과 일치
/ruby(!! ^Ruby/와 일치 "Ruby"
/Ruby$/

로 시작하는 문자열 또는 줄은 "Ruby"
/ARuby/로 끝나는 문자열 또는 줄과 일치합니다. "Ruby"로 끝나는 문자열 또는 줄과 일치합니다. 문자열과 일치합니다.
/RubyZ/로 시작 "Ruby"로 끝나는 문자열과 일치
/bRubyb/ 단어 경계에서 "Ruby"와 일치
/brubB/B 예 거짓 단어 경계: 일치 "rube" 및 "ruby"의 "rub", 그러나 "rub" 단독은 아님
/Ruby(?=!)/

"Ruby" 뒤에 느낌표 "Ruby"

가 오는 경우 일치합니다. /Ruby(?!!)/

괄호에 대한 특수 구문

"Ruby" 뒤에 느낌표가 없으면 "Ruby"와 일치합니다
Description
/R(?#comment)/은 "R"과 일치합니다. 나머지 문자는 모두 주석입니다.
/R(?i)uby/"uby" 일치 시 대소문자를 구분하지 않습니다.
/R(?i:uby)/위와 같습니다.
/rub(?:y|le))/ 그룹화만 가능, 1개의 역참조 없음

subgsub 및 대체 변수 sub! 검색 및 바꾸기 gsub!는 정규 표현식 작업 시 중요한 문자열 메서드입니다.

이러한 모든 방법은 정규식 패턴을 사용하여 검색 및 바꾸기 작업을 수행합니다. subsub!는 패턴의 첫 번째 항목을 바꾸고, gsubgsub!는 패턴의 모든 항목을 바꿉니다.

subgsub는 원래 문자열을 수정하지 않고 새 문자열을 반환하는 반면, sub!gsub!는 호출된 문자열을 수정합니다.

다음은 예입니다.

# 下面匹配单个斜杠字符,不转义
%r|/|               

# Flag 字符可通过下面的语法进行匹配
%r[</(.*)>]i


위 예의 출력은 다음과 같습니다.

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

phone = "138-3453-1111 #这是一个电话号码"

# 删除 Ruby 的注释
phone = phone.sub!(/#.*$/, "")   
puts "电话号码 : #{phone}"

# 移除数字以外的其他字符
phone = phone.gsub!(/\D/, "")    
puts "电话号码 : #{phone}"

다음은 또 다른 예입니다.

电话号码 : 138-3453-1111 
电话号码 : 13834531111


위 예의 출력은

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

text = "rails 是 rails,  Ruby on Rails 非常好的 Ruby 框架"

# 把所有的 "rails" 改为 "Rails"
text.gsub!("rails", "Rails")

# 把所有的单词 "Rails" 都改成首字母大写
text.gsub!(/\brails\b/, "Rails")

puts "#{text}"