English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby 정규 표현식

정규 표현식특수 시퀀스의 문자로, 특별한 문법을 사용하여 문자열 집합을 일치시키거나 찾는 데 사용됩니다.

정규 표현식은 사전에 정의된 특정 문자와 이러한 특정 문자의 조합으로 "규칙 문자열"을 구성하며, 이 "규칙 문자열"은 문자열에 대한 필터링 로직을 표현합니다.

문법

정규 표현식표면적으로는 슬래시 사이나 %r 뒤의 어떤 구분자 사이에 위치한 모델이며, 다음과 같이 보입니다:

 /pattern/
/pattern/im    # 옵션을 지정할 수 있습니다
%r!/usr/local! # 사용자 정의 구분자를 포함한 정규 표현식

온라인 예제

#!/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

위의 예제 실행 결과는 다음과 같습니다:

Line1 contains Cats

정규 표현식 수식어

정규 표현식은 표면적으로 선택적인 수식어를 포함할 수 있으며, 모든 측면의 일치를 제어하는 데 사용됩니다. 수식어는 두 번째 슬래시 문자 후에 지정됩니다. 위의 예제와 같이 다음은 가능한 수식어입니다:

수식어描述
i일치하는 텍스트 시 대소문자를 무시합니다.
o#{} 삽입자를 한 번만 실행하며, 정규 표현식은 첫 번째 점검에서 이미 판단됩니다.
x공백을 무시하고, 표현식 전체에 공백 문자와 주석을 넣을 수 있습니다.
m匹配多行,把换行字符识别为正常字符。
다중 줄을 일치시키고, 줄 바꿈 문자를 일반 문자로 인식합니다.u,e,s,n-8을 정규 표현식으로 해석합니다.

)、EUC、SJIS 또는 ASCII를 사용합니다. 별도의 모듈이 지정되지 않으면 정규 표현식은 원본 인코딩을 사용합니다.

就像字符串通过 %Q 进行分隔一样,Ruby 允许您以 %r 作为正则表达式的开头,后面跟着任意分隔符。这在描述包含大量您不想转义的斜杠字符时非常有用。
# 아래는 단일 슬래시 문자를 일치시키고,逃脱하지 않습니다./%r|               
 
|
# Flag 문자는 다음 문법을 사용하여 일치시킬 수 있습니다./%r[<*(.

)>]i

정규 표현식 패턴제어 문자를 제외한+ ( * ? .^ $ ( ) [ ] { } | \)

,그 외의 모든 문자는 자신과 일치시킵니다. 제어 문자 앞에 반대표를 두고 제어 문자를逃脱할 수 있습니다.

다음 표는 Ruby에서 사용할 수 있는 정규 표현식 문법을 나열합니다.描述
패턴^
$줄의 시작을 일치시킵니다.
.줄의 끝을 일치시킵니다.
[...]괄호 내의 임의의 단일 문자를 일치시킵니다.
[^...]괄호 내에 없는 임의의 단일 문자를 일치시킵니다.
re*이전의 서브 표현식이 0 번 또는 여러 번으로 일치시킵니다.
re+이전의 서브 표현식이 1 번 또는 여러 번으로 일치시킵니다.
re?이전의 서브 표현식이 0 번 또는 1 번으로 일치시킵니다.
re{ n}이전의 서브 표현식이 n 번으로 일치시킵니다.
re{ n,}이전의 서브 표현식이 n 번 또는 n 번 이상으로 일치시킵니다.
re{ n, m}이전의 서브 표현식이 n 번 이상 m 번 이하로 일치시킵니다.
a| ba 또는 b를 일치시킵니다.
(re)정규 표현식을 그룹화하되 일치된 텍스트를 기억합니다.
(?imx)정규 표현식 내의 i, m, x 옵션을 일시적으로 활성화합니다. 괄호 내에 있으면 괄호 내 부분에만 영향을 미칩니다.
(?-imx)정규 표현식 내의 i, m, x 옵션을 일시적으로 비활성화합니다. 괄호 내에 있으면 괄호 내 부분에만 영향을 미칩니다.
(?: re)정규 표현식을 그룹화하되 일치된 텍스트를 기억하지 않습니다.
(?imx: re)예시: re)
(?-imx: re)예시: re)
(?#...)주석.
(?= re)패턴을 사용하여 위치를 지정합니다. 범위가 없습니다.
(?! re)패턴의 부정을 사용하여 위치를 지정합니다. 범위가 없습니다.
(?> re)뒤돌림 없이 독립적인 패턴을 일치시킵니다.
\w영어 단어 문자를 일치시킵니다.
\W영어 단어 문자가 아니라는 문자를 일치시킵니다.
\s백지 문자를 매칭
\S비백지 문자를 매칭
\d숫자를 매칭-9]。
\D비숫자를 매칭
\A문자열의 시작을 매칭
\Z문자열의 끝을 매칭합니다. 개행 문자가 있으면, 개행 문자 전에만 매칭
\z문자열의 끝을 매칭
\G마지막 매칭된 점을 매칭
\b괄호 외에서 단어 경계를 매칭하면, 괄호 내에서는 백스페이스 키(0x0을 매칭8)。
\B비단어 경계를 매칭
\n, \t, 등.개행 문자, 엔터 문자, 탭 문자 등을 매칭
\1...\9n번째 그룹 서브 표현식을 매칭
\10이미 매칭된 경우, n번째 그룹 서브 표현식을 매칭합니다. 그렇지 않으면 문자 코드의 8진수 표현을 가리킵니다.

정규 표현식 예제

문자

示例描述
/ruby/"ruby"를 매칭
¥Yen 기호를 매칭합니다. Ruby 1.9 와 Ruby 1.8 여러 문자를 지원

문자 클래스

示例描述
/[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]/모든 비숫자 문자를 매칭

특수 문자 클래스

示例描述
/./개행 문자를 제외한 모든 문자를 매칭
/./m다중 행 모드에서도 개행 문자를 매칭할 수 있습니다.
/\d/한 개의 숫자를 매칭합니다. 동의어는 /[0-9]/
/\D/한 개의 비숫자를 매칭합니다. 동의어는 /[^0-9]/
/\s/한 개의 백지 문자를 매칭합니다. 동의어는 /[ \t\r\n\f]/
/\S/한 개의 비백지 문자를 매칭합니다. 동의어는 /[^ \t\r\n\f]/
/\w/한 개의 단어 문자를 매칭합니다. 동의어는 /[A-Za-z0-9_]/
/\W/한 개의 비단어 문자를 매칭합니다. 동의어는 /[^A-Za-z0-9_]/

반복

示例描述
/ruby?/"rub" 또는 "ruby"를 매칭합니다. y는 선택사항입니다.
/ruby*/"rub"에 매칭 0 개나 많은 y.
/ruby+/"rub"에 매칭 1 개나 많은 y.
/\d{3}/정확히 매칭 3 개의 숫자.
/\d{3,}/매칭 3 개나 많은 숫자.
/\d{3,5}/매칭 3 개,4 개나 5 개의 숫자.

비만만 반복

이는 최소 반복 횟수를 매칭합니다.

示例描述
/<.*>/만만한 반복: "<ruby>perl>"을 매칭
/<.*?>/비만만 반복: "<ruby>perl>" 중 "<ruby>"을 매칭

원括호로 그룹화됨

示例描述
/\D\d+/无分组: + 重复 \d
/(\D\d)+/分组: + 重复 \D\d 对
/([Rr]uby(, )?)+/匹配 "Ruby"、"Ruby, ruby, ruby",等等

反向引用

这会再次匹配之前匹配过的分组。

示例描述
/([Rr])uby&\1ails/匹配 ruby&rails 或 Ruby&Rails
/(['"])(?:(?!\1).)*\1/单引号或双引号字符串。\1 匹配第一个分组所匹配的字符,\2 匹配第二个分组所匹配的字符,依此类推。

替换

示例描述
/ruby|rube/匹配 "ruby" 或 "rube"
/rub(y|le)/匹配 "ruby" 或 "ruble"
/ruby(!+|\?)/"ruby" 后跟一个或多个 ! 或者跟一个 ?

这需要指定匹配位置。

示例描述
/^Ruby/匹配以 "Ruby" 开头的字符串或行
/Ruby$/匹配以 "Ruby" 结尾的字符串或行
/\ARuby/匹配以 "Ruby" 开头的字符串
/Ruby\Z/匹配以 "Ruby" 结尾的字符串
/\bRuby\b/匹配单词边界的 "Ruby"
/\brub\B/\B 是非单词边界:匹配 "rube" 和 "ruby" 中的 "rub",但不匹配单独的 "rub"
/Ruby(?=!)/如果 "Ruby" 后跟着一个感叹号,则匹配 "Ruby"
/Ruby(?!!)/如果 "Ruby" 后没有跟着一个感叹号,则匹配 "Ruby"

圆括号的特殊语法

示例描述
/R(?#comment)/匹配 "R"。所有剩余的字符都是注释。
/R(?i)uby/当匹配 "uby" 时不区分大小写。
/R(?i:uby)/与上面相同。
/rub(?:y|le))/只分组,不进行 \\1 反向引用

搜索和替换

subgsub 及它们的代替变量 sub!gsub! 是使用正则表达式时重要的字符串方法。

所有这些方法都是使用正则表达式模式执行搜索与替换操作。subsub! 替换模式的第一次出现,gsubgsub! 替换模式的所有出现。

subgsub 返回一个新的字符串,保持原始的字符串不被修改,而 sub!gsub! 则会修改它们调用的字符串。

온라인 예제

#!/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}"

위의 예제 실행 결과는 다음과 같습니다:

Rails는 Rails, Ruby on Rails가 매우 좋은 Ruby 프레임워크입니다