各种模式
正则表达式的模式与匹配
正则表达式 =~ 字符串
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
例子
模式 |
字符串 |
匹配部分 |
/ABC\sDEF/ |
ABC DEF |
▶ABC DEF◀ |
/ABC\sDEF/ |
ABC\tDEF |
▶ABC\tDEF◀ |
/ABC\sDEF/ |
ABCDEF |
不匹配 |
\d
例子
模式 |
字符串 |
匹配部分 |
/\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/ |
ABC |
▶ABC◀ |
/\w\w\w/ |
abc |
▶abc◀ |
/\w\w\w/ |
012 |
▶012◀ |
/\w\w\w/ |
AB C |
不匹配 |
/\w\w\w/ |
AB\nC |
不匹配 |
\A
例子
模式 |
字符串 |
匹配部分 |
/\AABC/ |
ABC |
▶ABC◀ |
/\AABC/ |
ABCDEF |
▶ABC◀ DEF |
/\AABC/ |
012ABC |
不匹配 |
/\AABC/ |
012\nABC |
不匹配 |
\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 |
不匹配 |
使用+的例子
模式 |
字符串 |
匹配部分 |
/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 |
不匹配 |
使用+的例子
模式 |
字符串 |
匹配部分 |
/^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"
p re2 =~ "abc*def"
正则表达式的选项
选项 |
选项常量 |
意义 |
i |
Regexp::IGNORECASE |
不区分大小写 |
x |
Regexp::EXTENDED |
忽略模式中的空白字符 |
m |
Regexp::MULTILINE |
匹配多行 |
o |
无 |
只使用一次内嵌表达式 |
例子
str = "ABC\nDEF\nGHI"
p /DEF.GHI/ =~ str
p /DEF.GHI/m =~ str
/Ruby/i
Regexp.new("Ruby", Regexp::IGNORECASE)
捕获
/(.)(.)(.)/ =~ "abc"
p $1
p $2
p $3