概括、ruby提供内建的正则表达式支持,正则表达式是字符串处理的屠龙,正则表达式使我们只需要描述 字符串,而具体的处理就交给正则引擎就可以了。
正则表达式由元字符,转义字符、POSIX字符及普通字符组成。
元字符
在ruby的正则表达式中,有些字符表示特殊的意义,他们表示字符的种类,位置,数量等等信息,它们是
. , | , ( ) , [ ] , \ , ^ , { } , + , $ , * , ?
◆ ) 和 ] 只有在前面有(和]才是特殊字符。
◆ { 和 } 只有同时出现表示字符的数量是才是元字符。
◆ 对元字符进行转义就可以匹配元字符,例如 \( 匹配 (
◆ 元字符在不同的场合可能会具有不同的意义,例如()既可以表示分组也可以表示前向引用,同时还表示聚合。
转义字符及POSIX字符
转义字符及POSIX字符可以表示非打印字符或者一类字符。
普通字符
普通字符表示其自身。
正则表达式通过以下的方式来描述。
一、字符串里字符的种类?
字符或正则 | 表示的意义 |
. | 匹配除换行符以外的任意字符 |
[abc] - [^abc] | 匹配字符数组中的任意一个 |
| | ab|bc 匹配ab和bc |
\d - \D | 匹配数字 |
\s - \S | 匹配空白符 |
\w - \W | 匹配字母,数字,下划线 |
(?#comment) | 注释 |
#{表达式} | 表达式替换 |
普通字符 | 匹配自身,如/a/匹配"a" |
_____ | |
_____ | |
_____ | |
_____ | |
_____ |
POSIX字符类
POSIX字符 | 表示的意义 |
[:alnum:] | 匹配小写字母或者数字 |
[:alpha:] | 匹配大小写字母 |
[:cntrl:] | 匹配控制字符 |
[:digit:] | 匹配数字 |
[:graph:] | 匹配除了空格以外的可打印字符 |
[:lower:] | 匹配小写字符 |
[:print:] | 匹配任何可打印字符 |
[:punct:] | 匹配除了字母,数字及空格以外的可打印字符 |
[:space:] | 匹配空白符 |
[:upper:] | 匹配大写字母 |
[:xdigit:] | 匹配16进制数字0-f |
二、字符串里的字符位置?
字符或正则 | 表示的意义 |
^ | 匹配一行的起始位置 |
$ | 匹配一行的结尾位置 |
\A | 匹配字符串起始位置 |
\z | 匹配字符串结尾位置 |
\b - \B | 匹配单词边界 |
(?=reg) | 后面匹配一个/reg/的位置 |
(?!reg) | 后面不匹配一个/reg/的位置 |
(?<=reg) | 前面面匹配一个/reg/的位置 |
(?<!reg) | 前面不匹配一个/reg/的位置 |
三、字符串里的字符的数量?
字符或正则 | 表示的意义 |
* | >=0 |
+ | >=1 |
? | 0 或者 1 |
{m,n} | >=m 且 <=n |
{m,} | >=m |
{m} | ==m |
? | 在*,+,{}后表示数量尽量最少匹配 |
_____ | |
备注 | 数量词可以应用于(reg)整体 |
四、正则表达式的分组
可以对正则表达式进行分组,并在匹配成功后把分组的值存储到$1,$2,$3,$4.......
print $1,"\n",$2 if "a1b2c3d4e5" =~ /(\w{2})(\w*)/
五、正则表达式的匹配选项
可以在正则表达式后加上一些选项,对正则表达式进行额外的控制。
i 表示大小写不敏感
print "true" if "a" =~ /A/i #输出true
x 表示扩展模式,可以在正则表达式中插入空白符,较长的正则采用这种方式具有良好的阅读性。
print "true" if \
"ab12ef" =~ \
/ab
\d+
ef
#正则内的单行注释
/x #输出true
m 表示跨行模式,在此模式下. 可以匹配换行符。
print $1 if "abc\nef" =~ /(.*)/m #输出abc\nef
o 表示正则里的#{}表达式只被替换一次
六、字符串的正则替换
print "abcd".sub(/\w/,"9")
print "\n"
print "abcd".gsub(/\w/,"9")
七、正则中的特殊全局变量
$1,$2,$3....分组匹配文本
$` 匹配文本之前的文本
$' 匹配文本之后的文本
print $`,"\n",$&,"\n",$' if "ab9cd" =~ /\d/
八、正则表达式产生方式
除了一般的//以外,%r{}也可以。