正则指引-括号
之前学习字符组和量词,量词是形容字符组的,但是有时候我们希望用量词来形容多个元素,
我们可以用括号完成,我们可以使用(...)把目标元素括起来,就可以把括号内部看成一个整体,
在括号外部使用量词,量词就会对括号内部的所有元素作用。
用括号改变量词的作用元素:
re.research(r"^ab+$","ab"); != none //true
re.research(r"^ab+$","abb"); != none //true
re.research(r"^(ab)+$","abb"); != none //false
re.research(r"^(ab)+$","abab"); != none //true
括号的这种能力就做分组,括号还可以配合"|"来使用,使用形式(...|...),
在括号内用|分隔子表达式形成多选分支,分支数量没有限制,整个多选分支看成单个元素,
只要其中某一个分支表达式匹配成功,整个表达式就匹配成功,都不能则失败。
多选结构,一般是(..|..),但是有时候没有括号,就相当于最外边有一个括号,把整体看成一组。
括号有了分组的功能,还有在使用括号之后,正则表达式会保存每一个分组真正的文本,
还可以通过group(num),方法来获取匹配的文本:
re.research(r"(\d{4})-(\d{2})-(\d{2})","2010-08-09");
.group(1) //2010
.group(2) //08
.group(3) //09
在最外层还有一个隐式的括号,使用group(0)或group()获得:2010-08-09,
分组的编号是根据开括号的出现顺序确定的,第一个出现编号的就是1,因为始终最外层还有一个隐式的括号,它的编号才是0.
正则表达式替换:re.sub(pattern,replacement,string)
其中parttern用来匹配被替换的文本表达式,replacement是要替换的文本,String是要被替换的文本。
re.sub("[a-z]"," ","a1b2c3"); // 1 2 3
在替换中使用分组:
re.sub(r"(\d{4})-(\d{2})-(\d{2})",r"\1年\2月\3日","2010-08-09"); // 2010年08月09日
结果是将匹配的123组替换\1\2\3。
反向引用:
能应用分组的子表达式匹配的文本,一般是在匹配完成之后进行,也能在匹配的正则表达式中引用,这种功能叫做反向引用:
re.research(r"^([a-z])\1$","aa"); != none //true
re.research(r"^([a-z])\1$","ab"); != none //false