Latest web development tutorials

루비 정규 표현식

정규 표현식은 특별한 문법 패턴을 사용하여 일치 또는 스트링의 컬렉션를 찾는 특수 문자 시퀀스이다.

정규식 특정 문자 조합을 미리 정의하고, 이들 특정 문자의 수를 사용하는 "문자열 규칙"의 "규칙 문자열"문자열 필터링 로직을 표현하는 데 사용되는 구성한다.

문법

다음과 같은정규 표현식은 문자 그대로, 사이의 구분 기호와 함께 %의 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

정규 표현식 수정

정규 표현식은 문자 그대로 경기의 다양한 측면을 제어하기위한 선택 사항 수정을 포함 할 수있다. 제 슬래시 지정 후 수정 위의 예에서와 같이. 지수는 가능한 수정을 나열

수정 기술
나는 텍스트를 일치시킬 때의 경우를 무시합니다.
단지 # {} 보간, 정규 표현식 그가 판단된다 처음 한 번만 수행.
엑스 전체 표현식에서 공백과 코멘트를 허용 공백을 무시합니다.
m 여러 줄 매칭, 개행 문자는 일반 문자로 인식했다.
U, E, S, N 정규 표현식은 유니 코드 (UTF-8), EUC, SJIS 또는 ASCII로 해석됩니다. 어떠한 수정은 소스 코드를 사용하여 정규 표현식을 고려하지 않은 경우.

% Q 등으로 구분 된 문자열과 마찬가지로, 루비는 임의의 구분 기호 다음에 정규 표현식의 시작, 같은 %의 연구에 당신을 수 있습니다. 당신은 슬래시 문자를 탈출하지 않으려는 경우이 설명은 매우 유용 다수 포함되어 있습니다.

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

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

정규 표현식 패턴

제어문자뿐만 아니라,에서 (+ * ^ $ () [] {} |? \), 다른 모든 문자는 자신을 일치합니다.당신은 제어 문자를 탈출 백 슬래시를 배치하기 전에 문자를 제어 할 수 있습니다.

다음 표는 정규 표현식 구문 루비를 사용할 나열합니다.

模式描述
^匹配行的开头。
$匹配行的结尾。
.匹配除了换行符以外的任意单字符。使用 m 选项时,它也可以匹配换行符。
[...]匹配在方括号中的任意单字符。
[^...]匹配不在方括号中的任意单字符。
re*匹配前面的子表达式零次或多次。
re+匹配前面的子表达式一次或多次。
re?匹配前面的子表达式零次或一次。
re{ n}匹配前面的子表达式 n 次。
re{ n,}匹配前面的子表达式 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匹配空白字符。等价于 [\t\n\r\f]。
\S匹配非空白字符。
\d匹配数字。等价于 [0-9]。
\D匹配非数字。
\A匹配字符串的开头。
\Z匹配字符串的结尾。如果存在换行符,则只匹配到换行符之前。
\z匹配字符串的结尾。
\G匹配最后一个匹配完成的点。
\b当在括号外时匹配单词边界,当在括号内时匹配退格键(0x08)。
\B匹配非单词边界。
\n, \t, etc.匹配换行符、回车符、制表符,等等。
\1...\9匹配第 n 个分组子表达式。
\10如果已匹配过,则匹配第 n 个分组子表达式。否则指向字符编码的八进制表示。

정규 표현식의 예

문자

기술
/ 루비 / 경기 "루비"
¥ 엔 기호 일치합니다. 루비 1.9과 루비 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 反向引用

검색 및 바꾸기

정규 표현식 문자열 방법을 사용하는 경우서브와 GSUB대체 변수와서브!GSUB은!중요합니다.

이 모든 방법은 검색을 수행하고 작업을 대체하는 정규 표현식 패턴을 사용하고 있습니다.서브와 서브!발생, GSUB 및GSUB의첫 번째 교체패턴!패턴의 모든 항목을 대체합니다.

서브와 수정되지 않은 원래 문자열을 떠나 새로운 문자열을 반환하고, 서브!GSUB!그들이 호출 문자열을 수정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 框架