perl正则表达式 捕获
发布时间:2025-05-20 23:47:09 发布人:远客网络
一、perl正则表达式 捕获
1、说实话,这个我也研究半天,虽然最终搞明白了,但这种肯定真正编程时是肯定不提倡使用的,正则非常巧妙,几个符号缺一不可。
2、从perlre文档里面关于capture buffers的描述可以看出:Capture buffers are numbered from left to right,编号是从左到右的。也就是说,对于你这个表达式,最外面是$1,中间是$2,最里面是$3。
3、but inside this construct the numbering is restarted for each branch.
4、编号会重新开始,也就是以前的编号里的内容就被替换掉了。
5、#before---------------branch-reset-----------after
6、/(a)(?|x(y)z|(p(q)r)|(t)u(v))(z)/x
7、#1223234
然后程序解析正则,先看到的s...ly,于是找到了[softly],此为$3,然后要求0或多个空格,正好后面有一个空格,所以解析到了[softly ],此为$2。这时候关键来了,后面跟一个单纯的*。都知道*表示0或多次,但一般前面有个引导字符,表示你要0或多个什么字母,但这里前面没有字母,有的是一串的表达式,所以程序发现,我需要0或多个这种结构(s...ly)\s*的串,所以只能接着找看后来有没有这样的串。
8、然后程序解析正则,先看到的s...ly,于是找到了[softly],此为$3,然后要求0或多个空格,正好后面有一个空格,所以解析到了[softly ],此为$2。这时候关键来了,后面跟一个单纯的*。都知道*表示0或多次,但一般前面有个引导字符,表示你要0或多个什么字母,但这里前面没有字母,有的是一串的表达式,所以程序发现,我需要0或多个这种结构(s...ly)\s*的串,所以只能接着找看后来有没有这样的串。
9、所以程序接着找到[slowly],$3的内容被替换为这个,随后同样的$2被替换为[slowly ],然后再找,直到第4次,$3被替换为[subtly],$2同样是[subtly],查找结束,程序说,你要求0到多个(s...ly)\s*结构的串,我一共给你找到了4个这样的串,分别是:[softly ][slowly ][surely ][subtly],那么$1就是几个这样串的组合,就是完整的[softly slowly surely subtly]
10、说实话,我花了10分钟搞明白这个,自己都感觉挺无聊的,有时候不如折腾点有用的东西。。。。
二、perl 正则表达式 前后冒号什么意思
1、这句中的冒号是正则表达式的定界符,表示两个冒号之间是正则表达式,
2、把冒号换成斜杠是一样的都是定界符,
3、这句程序的意思是如果变量x中有双引号,则把变量x的内容加单引号追加到变量cmd中
4、如果变量x中没有双引号,则什么也不做.
5、完整的程序如下(冒号换成斜杠是一样的,一个有双引号,一个没有双引号)
三、正则表达式“或“的使用
正则表达式,又称规则表达式。是计算机科学的一个概念。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
检查字符串是否符合正则表达式中的规则,有一次不匹配,则返回false。如:
String reg="[a-zA-Z]\\d?";//次表达式表示字符串的第一位只能是字母,第二位只能是数字或没有boolean flag=str.matches(reg);//返回结果为true。
所谓切割,即是按一定的规则将字符串分割成多个子字符串,如:
String str="zhangsan,lishi,wangwu"。
String reg=",";//表示以逗号作为切割符。
String[] arr=str.split(reg);//返回结果为{“zhangsan”,"lisi","wangwu}。
即将字符串中符合规则的字符替换成指定字符,如:
String str="sfhjhfh136hjasdf73466247fsjha8437482jfjsfh746376"。
str.replaceAll("\\d{3,}","#");//表示将连续出现三个或三个以上的数字替换成“#”。
参考资料来源:百度百科-正则表达式