笔记1
1.什么是正则表达式?
答:正则表达式是一种匹配文本中的字符序列的字符模式。
2.使用正则表达式分析方法的过程?
答:用自然语言表达说明你的意图 -->了解数据源及可能的内容 --> 清楚在当前环境(编译器,语言)下可用的正则表达式选项 -->调整灵敏度和特殊性 --> 创建适当的正则表达式 -->对较为复杂的正则表达式给予说明 --> 测试结果正确与否
在“对较为复杂的正则表达式给予说明”这一步,具体包括:
① 说明希望用正则表达式做什么;
② 具体说明想匹配什么;
③ 说明不想匹配什么。
3.常用限定符
限定符 | 功能 |
? | 匹配前一个字符块,0个或1个,等价于{0,1} |
+ | 匹配前一个字符块,1个或无数个,等价于{1,} |
* | 匹配前一个字符块,0个或无数个,等价于{0,} |
{n} | 匹配前一个字符块,n个 |
{n,m} | 匹配前一个字符块,最少n次,最多m次。当省略m值,等价于n次至无数次 |
4. 常用元字符
元字符 | 功能 |
. | 匹配除换行符外任意字符 |
\w | 匹配英文字母、数字、下划线 |
\W | 匹配所有\w不匹配的字符 |
\d | 匹配数字字符,即[0-9] |
\D | 匹配所有\d不匹配的字符 |
\s | 匹配一个空格符、制表符、换行符 |
\S | 匹配所有\s不可匹配的字符,即任何非空白字符 |
\t | 匹配一个制表符 |
\n | 匹配一个换行符 |
\ | 转义字符 |
^ | 当在方括号之外时,直接匹配位于一行或一个字符串开始位置之后的目标字符。当为方括号内第一个字符,对字符类取反;反之,匹配字符本身 |
$ | $指定出现在一个文件结束位置或文件中一行结束位置之前的字符序列。 |
\< | 识别位于一个词开始位置的词边界,它的前面是一个非字母(数字)字符 |
\> | 匹配词结尾处的词边界,它的后面是一个非字母(数字)字符 |
\b | 匹配词开始处的词边界,也匹配词结尾处的词边界 |
\B | 含义与\b相反,匹配一个非词边界的位置 |
- | 当出现在方括号外或在方框号内两端时,匹配字符本身;反之,作为连字符用 |
| | 或 |
5. 什么是字符类?字符类使用方法
答:字符类是一些字符的无序组合,正则表达式模式可以从这个组合中挑选出一个字符来完成匹配。
当字符类不带有关联的限定符时,只会指定其中一个字符用于匹配。如Sm[yi]th,会匹配Smith,Smyth,但不匹配Smth 。多数情况下,单个字符在字符内部的含义与它在字符类外部含义相同,但也有不同者。如‘ ^ ’ ,’ - ’ 等。
6.POSIX字符类表示法
有些正则表达式支持一些特殊字符类表示法——POSIX字符类表示法。它使用一种命令来表示很多有用的字符类,与平时看到的不同。如[:alnum:] = [A-Za-z0-9]。若出现这样的字符类表示法,要查阅相关资料。
7.向前查找和向后查找?
答:向前(后)查找时根据某个字符序列的后面或前面是什么来决定是否匹配。分为
① 肯定向前:要匹配的字符序列后面存在一个特定的字符序列
② 否定向前:要匹配的字符序列后面不存在一个特定的字符序列
③ 肯定向后:要匹配的字符序列前面存在一个特定的字符序列
④ 否定向后:要匹配的字符序列前面不存在一个特定的字符序列
8.开始圆括号元字符
符号 | 含义 |
(?:) | 非捕获组 (圆括号内内容不会捕获到变量中) |
(?=) | 肯定式向前查找 |
(?!) | 否定式向前查找 |
(?<=) | 肯定式向后查找 |
(?<!) | 否定式向后查找 |
9.向前(后)查找的一个应用:
问题:将文档中的数字添加逗号分隔符(如1234567 -> 1,234,567)
解法: 找出要加逗号的位置,然后在这些位置上添加逗号。
i. 自然语言书写:
在所有前面位置为一个数字,后面位置为三个数字的地方添加逗号;
ii. 了解数据源可能出现的内容:
假设数据中数字为十进制自然数合法形式。
iii. 创建正则表达式,找出合理位置:
(?<=\d)(?=(\d\d\d)+\W)
iv. 分析:
第一个圆括号为查找所有前面是一个0~9的数字的位置,后一个括号查找所有后面是字符组:(一个连续三个数字,或连续三的倍数个数字并且最后为一个非字母,数字,下划线的符号).
v. 根据使用语言和工具,选择适当函数和方法将逗号添加到找出的位置中。
10.什么是灵敏度?什么是特殊性?
答 : 灵敏度是匹配模式的能力,特殊性是把模式选择的字符序列限定为索要选择的字符序列的能力。使用正则表达式时,灵敏度越高,表明找到的真正匹配项数目越接近要找的全部匹配项;特殊性越高,则表明找到的匹配项中正确的匹配项越多。
举例来说:要找100个,实际找了150个,其中有100个正确的,则灵敏度为100%,特殊性为100/150=66.7% 又比如要匹配“Abc”用模式 .* ,灵敏度为100%,但特殊性非常差。