Ruby中的正则表达式2007-04-26 10:45
==========概念==========
在Ruby中,正则表达式也是一个对象,Ruby对它提供了内建的支持,Ruby把匹配的结果(nil或MatchData对象)放在一个局部线程变量$~中,当匹配失败时,返回值是nil,当成功匹配时,返回一个MatchData的对象,它包含了匹配的全部信息,看下面的详细解说。
一、在Ruby中正则表达式是Regexp对象可以通过/partten/或%r{partten}来创建他们,下面是例子。
a=Regexp.new('^\s*[a-z]')
b=/^\s*[a-z]/
c=%r{^\s*[a-z]}
二、Ruby通过Regexp.match(string)方法来进行一次匹配,并通过下面的方式保存了匹配结果,例子:
re = /(\d+):(\d+)/ #这是一个匹配时间的pattern,并包含了2个匹配组
md = re.match("Time: 12:42am") #匹配成功将matchdata对象赋予变量md
md.class #==> MatchData 验证了一下
md[0] # == $&; ->"12:42" 匹配串
md[1] # == $1 ->"12" 第一个匹配组
md[2] # == $2 ->"42" 第二个匹配组
md.pre_match # == $` ->"Time: " 匹配前的串
md.post_match # == $' ->"am" 匹配后的串
事实上当匹配成功后,$~保存了结果,然后其它的值都是由$~分发出来的,下面的代码可以说明这个
问题。
re = /(\d+):(\d+)/
md1 = re.match("Time: 12:51am")
md2 = re.match("Time: 10:32pm")
[$1,$2] ->["10","32"] 变量保存了最后一次成功匹配的结果
$~ = md1 将md1变量赋给了$~,这样就把md1引用的对象MatchData给了$~
[$1,$2] ->["12","51"] 这里也就变成了md1的,说明$1,$2,$`,$'$&;等变量都是用$~分发的,$~记录了最有一次匹配的全部结果。
==========元字符及字符类==========
. 表示除回车换行符之外的任何字符(尽管在多行模式下它也匹配回车换行符)
| 左边和右面的二选一
+ r+ 匹配一个或多个r的出现
* r* 匹配0个或多个r的出现
? r?匹配0个或1个r的出现
{m,n} r{m,n} 匹配至少m至多n个r出现
{m,} r{m,} 匹配至少m个r出现
{m} r{m} 匹配m个r出现
\ 表示后边的一个字符是转义字符
^ 匹配行首
$ 匹配行尾
\A 匹配字符串的开始
\Z 匹配字符串的结尾,\z在字符串结尾是换行符时,不能匹配结尾的字符。
\b 匹配词的边界,词可以是字母数字和下划线。
\B 匹配非词的边界
\d 数字字符
\D 非数字字符
\s 空格字符
\S 非空格字符
\w 组词字符[0-9a-zA-Z]
\W 非组词字符
() 将()内的内容表示为一个整体,一个匹配组,并有更大的优先级
[]
匹配方括号之间的任何单个字符 . | () [ { + ^ $ * ? 在方括号中是关闭的,还有 - ] 匹配时要
放到首位,^放在首位表示求反。要放到首位,^放在首位表示求反。
\num 代表至今为止,第num个已匹配的组
\&; 最后的匹配
\+ 最后匹配的组
\` 匹配之前的字符串
\' 匹配之后的字符串
\\ 匹配反斜杠
==========备注==========
一、String.sub和String.gsub的第二个参数可以string或者block,如果是块,匹配的字符串就会被传递到block,同时block的结果值会替换到原来的字符串中。例子:
a="the quick brown fox"
a.gsub(/\w\b/) {|match| match.upcase} #==> "The Quick Brown Fox"
二、 陷井。 /a*/模式会匹配任何字符串:每个字符串都会有零个或多个a