正则表达式中的符号



最基本的有关正则表达式的使用前面说了,有关Regexp类中的$符号也有说明,再补充说明一下一些常用的符号。

正则表达式中有几部分内容:

1. 先是patterns,所有字符除了., |, (, ), [, {, +, \, ^, $, , 和 ?之外,都匹配自己本身。接下来其实就是了解这些乱七八糟的符号分别干嘛的。\ 用来做字符转义。
2. anchors,^, $是最基本的表示首和尾,除此之外还有\A, \z, \Z, \b, \B。
>- \A 字符串的开始
>- \z 字符串的结尾
>- \Z 支持以换行符结束的字符串的结尾
>- \b 单词首尾
>- \B 非单词首尾

1.9.3p125 :024 > showRE(“this is the time”, /time\z/)
=> “this is the <>” 1.9.3p125 :025 > showRE(“this is the time”, /time\Z/)
=> “this is the <>” 1.9.3p125 :026 > showRE(“this is the time\n”, /time\Z/)
=> “this is the <>\n” 1.9.3p125 :027 > showRE(“this is the time\n”, /time\z/)
`
3. 字符类(character class),放在[]中,有\d, \D, \s, \S, \w, \W。大写字母表示否定。
>- \d [0-9]数字
>- \D [^0-9]非数字
>- \s [\s\t\r\n\f] 空格
>- \S [^\s\t\r\n\f] 非空格 >- \w [A-Za-z0-9_] 单词字符
>- \W[^A-Za-z0-9_] 非单词字符4. 用于表示重复,
, +, ?,还有{m,n}, {m,}的形式。
5. 替换,|
6. 组合,()

乱七八糟的字符就说完了,还有一个常用的是替换,也就是sub和gsub,这里会用到\1, \2等模式中匹配到的变量,比如:

`
“fred:smith”.sub(/(\w+):(\w+)/, ‘\2, \1’) » “smith, fred”
“nercpyitno”.gsub(/(.)(.)/, ‘\2\1’) » “encryption”

Ruby中正则表达式的类处理



正则表达式的技巧太多了,还是需要实际经验,积累一些技巧。

不过最让我看到有兴趣的还是Ruby中正则表达式也是对象,只不过再基于“$特殊变量”封装使得所有的处理看起来和Perl的风格处理类似,挺有趣。

看下面的两个例子,能很好的说明。

用//括起来的正则表达式是Regexp对象,match匹配的结果是一个MatchData实例,MatchData是一个特殊变量$~的类型,封装了通过特殊变量$&,$’, $, $1, $2等等返回的结果。 re = /(\d+):(\d+)/ # match a time hh:mm re.class # Regexp md = re.match("Time: 12:34am") md.type » MatchData md[0] # == $&amp; » "12:34" md[1] # == $1 » "12" md[2] # == $2 » "34" md.pre_match # == $ » “Time: “
md.post_match # == $’ » “am”
</pre> 看明白了没?那么如果做连续两次正则表达式匹配,特殊变量$存放的会是最后一次的结果,这时你可以把上一次的匹配结果MatchData用变量保存起来,需要的时候恢复即可。 <pre>
re = /(\d+):(\d+)/
md1 = re.match(“Time: 12:34am”)
md2 = re.match(“Time: 10:30pm”)
[ $1, $2 ] # last successful match » [“10”, “30”]
$~ = md1
[ $1, $2 ] # previous successful match » [“12”, “34”]