MasteringRegEx

一、Non-Capturing

这个Non-Capturing的确不知道该如何翻译(非捕获?),但意思是明白了。用圆括号括起来的部分可以被捕获到$1、$2……中,但如果起始圆括号后面紧跟一个问号和冒号,就表示本组不需要被捕获到$1、$2……中。

例如,下列正则表达式中

^([-+]?\d+(\.\d*)?)([CF])$

  • 第1个被捕获的组:从第一个左圆括号,到与该左圆括号配对的右括号,被存储到$1中(整数+小数点+小数部分)
  • 第2个被捕获的组:从第二个左圆括号,到与该左圆括号配对的右括号,被存储到$2中(小数点+小数部分)
  • 第3个被捕获的组:从第三个左圆括号,到与该左圆括号配对的右括号,被存储到$3中(C或F)

如果是下面的正则表达式:

^([-+]?\d+(?:\.\d*)?)([CF])$

注意红色的部分,有了这个就表示本组不要捕获,这样,$2中存储的就是([CF])这一组,没有$3了。

二、字符转义

  • \bTAB字符(ASCII码9)
  • \n换行符(ASCII码10)
  • \r回车符(ASCII码13)
  • \s所有能代表“空白”的字符(包括空格、制表、换行等)
  • \S所有不是\s的字符
  • \w大小写字母、数字和下划线,与[a-zA-Z0-9_]等价
  • \W所有不是\w的字符,与[^a-zA-Z0-9_]等价
  • \d数字,与[0-9]等价
  • \D所有非数字字符,与[^0-9]等价

三、文本替换

先前知道了m的作用(匹配),把m换成s就成了“替换”,另外,好友告诉我有了m,就可以用任何一对符号来括住正则表达式,不必老是用/,说不定s也一样。

$name =~ s/\bSaddam\b/Bush/;

这句表示:把$name里面存储的内容,凡是匹配到单词边界的Saddam,通通替换为Bush。

四、Perl的一些语法

while ($var = <>) {}

这个“$var=<>”看起来有点古怪,其实就是“var = getline()”,也就是说,从输入流中取下一行的内容,并赋值变量中,如果输入流已结束,则变量值未定义,同时整个赋值表达式返回布尔假。

关键字last,与C里面的continue类似。

函数defined($var)测试一个变量里是否含有值,是则返回true,否则返回false。


评论

该日志第一篇评论

发表评论

评论也有版权!