各种模式

正则表达式的模式与匹配

#正则表达式 =!~ 字符串

正则表达式 =~ 字符串
#=> nil 或者 位置

if 正则表达式 =~ 字符串
    匹配时的处理
else
    不匹配时的处理
end

匹配普通字符

模式 字符串 匹配部分
/ABC/ ABC ▶ABC◀
/ABC/ ABCDEF ▶ABC◀DEF
/ABC/ 123ABC 123▶ABC◀
/ABC/ A1B2C3 不匹配
/ABC/ AB 不匹配
/ABC/ abc 不匹配

匹配行首与行尾

只匹配ABC,而不匹配ABCDEF

^行首,$行尾

模式 字符串 匹配部分
/^ABC$/ ABC ▶ABC◀
/^ABC$/ ABCDEF 不匹配
/^ABC$/ 123ABC 不匹配
/^ABC/ ABC ▶ABC◀
/^ABC/ ABCDEF ▶ABC◀DEF
/^ABC/ 123ABC 不匹配
/ABC$/ ABC ▶ABC◀
/ABC$/ ABCDEF 不匹配
/ABC$/ 123ABC 123▶ABC◀
/^ABC$/ 012\nABC 012\n▶ABC◀

指定匹配字符范围

模式 意义
[AB] A或B
[ABC] A或B或C
[CBA] 同上
[012ABC] 0、1、2、A、B、C中的1个字符
[A-Z] 从A到Z的全部大写英文字母
[a-z] 从a到z的全部小写英文字母
[0-9] 从0到9的全部数字
[A-Za-z] 从A到Z与从a到z的全部英文字母
[A-za-z_] 全部英文字母与_
[A-za-z0-9_-] 全部英文字母、全部数、_、-
[^ABC] A、B、C以外的字符
[^a-zA-Z] a到z,A到Z(英文字母)以外的字符

使用[]的例子

模式 字符串 匹配部分
/[ABC]/ B ▶B◀
/[ABC]/ BCD ▶B◀CD
/[ABC]/ 123 不匹配
/a[ABC]c/ aBc ▶aBc◀
/a[ABC]c/ 1aBcDe a▶aBc◀De
/[ABC]/ abc 不匹配
/[^ABC]/ 1 ▶1◀
/[^ABC]/ A 不匹配
/a[^ABC]c/ aBcabc aBc▶abc◀

使用多个[]的例子

模式 字符串 匹配部分
/[ABC][AB]/ AB ▶AB◀
/[ABC][AB]/ AA ▶AA◀
/[ABC][AB]/ CA ▶CA◀
/[ABC][AB]/ CCCCA CCC▶CA◀
/[ABC][AB]/ xCBx x▶CB◀x
/[ABC][AB]/ CC 不匹配
/[ABC][AB]/ CxAx 不匹配
/[ABC][AB]/ C 不匹配
/[0-9][A-Z]/ 0A ▶0A◀
/[0-9][A-Z]/ 000AAA 00▶0A◀AA
/[^A-Z][A-Z]/ 1A2B3C ▶1A◀2B3C
/[^0-9][^A-Z]/ 1A2B3C 1▶A2◀B3C

匹配任意字符

模式 意义
. 匹配任意字符
/^...$/ 匹配字符数为3的行

例子

模式 字符串 匹配部分
/A.C/ ABC ▶ABC◀
/A.C/ AxC ▶AxC◀
/A.C/ 012A3C456 012▶A3C◀456
/A.C/ AC 不匹配
/A.C/ ABBC 不匹配
/A.C/ abc 不匹配
/aaa.../ 00aaabcde 000▶aaabcd◀e
/aaa.../ aaabb 不匹配

使用反斜杠的模式

\s

模式 意义
\s 空格、制表符、换行符、换页符

例子

模式 字符串 匹配部分
/ABC\sDEF/ ABC DEF ▶ABC DEF◀
/ABC\sDEF/ ABC\tDEF ▶ABC\tDEF◀
/ABC\sDEF/ ABCDEF 不匹配

\d

模式 意义
\d 匹配0-9的数字

例子

模式 字符串 匹配部分
/\d\d\d-\d\d\d\d/ 012-3456 ▶012-3456◀
/\d\d\d-\d\d\d\d/ 01234-012345 01▶234-0123◀45
/\d\d\d-\d\d\d\d/ ABC-DEFG 不匹配
/\d\d\d-\d\d\d\d/ 012-21 不匹配

\w

模式 意义
\w 匹配英文字母与数字

例子

模式 字符串 匹配部分
/\w\w\w/ ABC ▶ABC◀
/\w\w\w/ abc ▶abc◀
/\w\w\w/ 012 ▶012◀
/\w\w\w/ AB C 不匹配
/\w\w\w/ AB\nC 不匹配

\A

模式 意义
\A 匹配字符串的开头

例子

模式 字符串 匹配部分
/\AABC/ ABC ▶ABC◀
/\AABC/ ABCDEF ▶ABC◀DEF
/\AABC/ 012ABC 不匹配
/\AABC/ 012\nABC 不匹配

\z

模式 意义
\z 匹配字符串的末尾

例子

模式 字符串 匹配部分
/ABC\z/ ABC ▶ABC◀
/ABC\z/ 012ABC 012▶ABC◀
/ABC\z/ ABCDEF 不匹配
/ABC\z/ 012\nABC 012\n▶ABC◀
/ABC\z/ ABC\nDEF 不匹配

元字符转义

模式 意义
* 重复0次以上
+ 重复1次以上
? 重复0次或1次(不能多了)

使用*的例子

重复0次以上

模式 字符串 匹配部分
/A*/ A ▶A◀
/A*/ AAAAAA ▶AAAAAA◀
/A*/ ▶◀(这样是可以匹配的)
/A*/ BBB ▶◀BBB
/A*C/ AAAC ▶AAAC◀
/A+C/ BC B▶C◀
/A*C/ AAAB 不匹配
/AAA*C/ AAC ▶AAC◀
/AAA*C/ AC 不匹配
/A.*C/ AB012C ▶AB012C◀
/A.*C/ AB CD ▶AB C◀D
/A.*C/ ACDE ▶AC◀DE
/^Subject:\s*.*$/ Subject: foo ▶Subject: foo◀
/^Subject:\s*.*$/ Subject: Re: foo ▶Subject: Re: foo◀
/^Subject:\s*.*$/ Subject: Re^2 foo ▶Subject: Re^2 foo◀
/^Subject:\s*.*$/ in Subject:Re foo 不匹配

使用+的例子

  • 重复1次以上*
模式 字符串 匹配部分
/A+/ A ▶A◀
/A+/ AAAAAA ▶AAAAAA◀
/A+/ 不匹配
/A+/ BBB 不匹配
/A+C/ AAAC ▶AAAC◀
/A+C/ BC 不匹配
/A+C/ AAAB 不匹配
/AAA+C/ AAC 不匹配
/AAA+C/ AC 不匹配
/A.+C/ AB012C ▶AB012C◀
/A.+C/ AB CD ▶AB C◀D
/A.+C/ ACDE 不匹配

使用+的例子

  • 重复0次或1次*
模式 字符串 匹配部分
/^A?$/ A ▶A◀
/^A?$/ AAAAAA 不匹配
/^A?$/ ▶◀
/^A?C/ AC ▶AC◀
/^A?C/ AAAC 不匹配
/^A?C/ BC 不匹配
/^A?C/ C ▶C◀
/AAA?C/ AAAC ▶AAAC◀
/AAA?C/ AAC ▶AAC◀
/AAA?C/ AC 不匹配
/A.?C/ ACDE ▶AC◀DE
/A.?C/ ABCDE ▶ABC◀DE
/A.?C/ AB012C 不匹配
/A.?C/ AB CD 不匹配

最短匹配

模式 意义
*? 0次以上的重复中最短的部分
+? 1次以上的重复中最短的部分

例子

模式 字符串 匹配部分
/^A.*B/ ABCDABCDABCD ▶ABCDABCDAB◀CD(贪婪匹配)
/^A.*C/ ABCDABCDABCD ▶ABCDABCDABC◀D
/^A.*?B/ ABCDABCDABCD ▶AB◀CDABCDABCD(懒惰匹配)
/^A.*?C/ ABCDABCDABCD ▶ABC◀DABCDABCD
/^A.+B/ ABCDABCDABCD ▶ABCDABCDAB◀CD
/^A.+C/ ABCDABCDABCD ▶ABCDABCDABC◀D
/^A.+?B/ ABCDABCDABCD ▶ABCDAB◀CDABCD(懒惰匹配)
/^A.+?C/ ABCDABCDABCD ▶ABC◀DABCDABCD

()与重复

模式 意义
() 重复匹配多个字符

例子

模式 字符串 匹配部分
/^(ABC)*$ ABC ▶ABC◀
/^(ABC)*$ ▶◀
/^(ABC)*$ ABCABC ▶ABCABC◀
/^(ABC)*$ ABCABCAB 不匹配
/^(ABC)+$ ABC ▶ABC◀
/^(ABC)+$ 不匹配
/^(ABC)+$ ABCABC ▶ABCABC◀
/^(ABC)+$ ABCABCAB 不匹配
/^(ABC)?$ ABC ▶ABC◀
/^(ABC)?$ ▶◀
/^(ABC)?$ ABCABC 不匹配
/^(ABC)?$ ABCABCAB 不匹配

选择

用|在几个候补模式中匹配任意一个

例子

模式 字符串 匹配部分
/^(ABC|DEF)$/ ABC ▶ABC◀
/^(ABC|DEF)$/ DEF ▶DEF◀
/^(ABC|DEF)$/ AB 不匹配
/^(ABC|DEF)$/ ABCDEF 不匹配
/^(AB|CD)+$/ ABCD ▶ABCD◀
/^(AB|CD)+$/ 不匹配
/^(AB|CD)+$/ ABCABC 不匹配
/^(AB|CD)+$/ ABCABCAB 不匹配

使用quote方法的正则表达式

转义正则表达式中的所有元字符。注意,这样就不能使用元字符了,不推荐使用

re1 = Regexp.new("abc*def")
re2 = Regexp.new(Regexp.quote("abc*def"))

p re1 =~ "abc*def"
#=> nil

p re2 =~ "abc*def"
#=> 0

正则表达式的选项

选项 选项常量 意义
i Regexp::IGNORECASE 不区分大小写
x Regexp::EXTENDED 忽略模式中的空白字符
m Regexp::MULTILINE 匹配多行
o 只使用一次内嵌表达式

例子

str = "ABC\nDEF\nGHI"
p /DEF.GHI/ =~ str
#=> nil

p /DEF.GHI/m =~ str
#=> 4


/Ruby/i
#等价于
Regexp.new("Ruby", Regexp::IGNORECASE)

捕获

/(.)(.)(.)/ =~ "abc"
p $1    #=> "a"
p $2    #=> "b"
p $3    #=> "c"