正则表达式
正则表达式笔记
正则表达式使用详解
使用正则表达式的作用
- 实现复杂文本逻辑的替换
- 查找文本模式
- 提取文本模式
<!doctype html>
<html ng-app="MyModule">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">
</head>
<body>
<div ng-controller="MyCtrl">
<greeting greet="sayHello(name)"></greeting>
<greeting greet="sayHello(name)"></greeting>
<greeting greet="sayHello(name)"></greeting>
</div>
<p>number:123-3456-7923</p>
<p>hello hello hello hello hello </p>
</body>
<script src="framework/angular-1.3.0.14/angular.js"></script>
<script src="ScopeAnd.js"></script>
</html>
匹配模式空行
注意:在使用正方向预查时,注意预查信息要保证唯一性,及预查模式不存在此时匹配的情况。
也不能出现模式嵌套
(?<=\n)\s*\n //匹配空行
^\s\s$ // 匹配规则同上
涉及知识点
正则符号 | 作用 |
---|---|
(?<=pattern) | 限定搜索字符串前的限制条件,比如范例中(?<=\n)\s ,只搜索前面是换行符的空白字符 |
* | 表示前面内容重复0到多次,类似{0,} ,比如 \s* 匹配多个或没有空白 |
^ | 表示一行输入字符串开始位置,^\s ,搜索以空白符开始的行 |
$ | 表示一行输入字符串结束位置,\s$ ,搜索以空白字符结束的行 |
\s | 单个空白字符,和[\f\n\r\t\v] 相同 |
匹配 5 个字母的单词
\b[[:alpha:]]{5}\b
正则符号 | 作用 |
---|---|
[[:alpha:]] | 表示一个字母 |
{n} | 表示前面的内容重复5次,a{5} ,搜索5个相同字母a 的字符串 |
\b | 匹配单词的边界的位置 |
匹配一个尖括号内的内容
(?<=<).*?(?=>)
正则符号 | 作用 |
---|---|
(?=>) | 正向肯定预查,限定字符串后面的搜索条件,(?=>) 表示搜索字符内容后面必须有>符号 |
? | 当 ? 跟在*,{n,m},+ 等次数符后面时,表示以最少字符串数量匹配限定条件,默认的是贪婪算法及尽可能多的匹配字符 |
. | 表示除\n 外所有字符 |
匹配电话号码
\d{3}(-\d{4}){2}
正则符号 | 作用 |
---|---|
\d | 表示 0-9 的数字,类似于[0-9] |
{n} | 重复前面的模式 n 次 |
后向引用
当我们利用括号进行字符匹配的时候存在两种情况
- 只搜索匹配的模式,匹配的模式不会缓存
- 搜索到匹配模式后,将匹配模式的的字符串进行缓存
对于模式以,一般是将就的内容整个覆盖为新内容,而模式二则是对旧的内容做部分更改, 及在保留部分原格式的基础上,插入信的格式,此时在替换时就需要利用缓存的内容来进行更新。
对于所有加括号内容,都会实现缓存。缓存的规则如下
- 从左到右,以分组的左括号为标记,每出现一次左括号,分组序号加1
- 对于每个匹配的字符串模式,都包含这样一个分组数组,用于保存模式匹配内容
- 利用
\n
表示每个匹配字符串对应的,分组内容 - 在实现第二种替换时,利用
$n
来表示分组替换模式
其中 \n
的模式匹配比较难与理解简单讲述一下
查找内容:((\bhello\b)\s+)\1
替换内容:$1
- 由于出现左括号变代表分组,所以每个匹配字符串会保存两个分组
- 分组1 -> 最外面的大括号匹配的字符串内容,表示后面有空白的 hello 单词
- 分组2 -> 内层括号匹配的字符串内容,表示hello单词
- 由于匹配模式后面带有\1,它表示重复步骤2中的分组结果,及后面带有空白的 hello 字符,
- $2 替换第4步搜索到的字符串内容,为第1个分组中的内容
正则符号 | 作用 |
---|---|
(exp) | 搜索括号中模式,并保存到分组中 |
(?<name>exp) | 将匹配模式内容,保存到名字为name的分组中,也可以使用(?'name'exp)的模式 |
(?:exp) | 搜索括号中模式,不保存到分组内容 |
(?=exp) | 正向肯定预查,匹配 exp 后面的位置 |
(?<=exp) | 反向肯定预查,匹配 exp 前面的位置 |
(?!exp) | 正向否定预查,匹配不是 exp 后面的位置 |
(?<!exp) | 反向否定预查,匹配不是 exp 前面的位置 |
(?#comment) | 正则表达式中的注释来描述匹配规则,对匹配不产生影响 |
正则使用配置项
名称 | 说明 |
---|---|
IgnoreCase(忽略大小写) | 匹配时不区分大小写。 |
Multiline(多行模式) | 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) |
Singleline(单行模式) | 更改.的含义,使它与每一个字符匹配(包括换行符\n)。 |
IgnorePatternWhitespace(忽略空白) | 忽略表达式中的非转义空白并启用由#标记的注释。 |
ExplicitCapture(显式捕获) | 仅捕获已被显式命名的组。 |
平衡组递归匹配
替换模式 利用 \L或\l 实现对匹配组字符大小写的转换。
正则的基本介绍
正则是用来对文本进行模式匹配的语法。