首页 > 代码库 > 面包屑之正则表达式
面包屑之正则表达式
近来有在读《精通正则表达式》,就记录下自己的一些收获吧。
首先讲讲正则中的元字符,以及他们的优先级。
运算符 | 说明 |
\ | 转义符 |
(), (?:), (?=), [] | 括号和中括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, /任何元字符、任何字符 | 定位点和序列 |
| | 替换
|
简单讲讲常用的一些元字符吧。
1,字符组("[]")
字符组在正则中表示的是 既定范围内中的单个字符。
在字符组的内部,元字符的定义规则(及它们的意义)是不一样的。例如:
^ 在字符组中就代表是 非 的意思; [^abc] 表示的意思是 除 a,b,c 以外的任意单个字符。而在外部则代表的是匹配字符串的头部。
- 在字符组中就是连字符 [0-9] 表示的意思就是 0到9中的任意单个字符。 在外部只能匹配 "-"这个字符。
不要混淆多选项和字符组。 字符组 [abc] 和多选项 (a|b|c) 固然表示的是一个意思。但它们有明显的不同,字符组只能匹配单个字符,多选项则不同,它可以匹配任意
长度的文本。每个多选项可能匹配的文本都是独立的,例如 (10,000,000|milloon|abcdajoie)。多选项没有字符组的排除功能。(多选项是顺序匹配的,多余的选择会用来回溯)
2,量词("?,+,*,{}")
代表的是匹配的次数。 ?-----> 0或1次
* -----> 0或n次
+ -----> 1或n次
3,环视("(?=......) (?!......) (?<=......) (?<!......)") 匹配的是一个位置。(有些只支持固定文本 即不带任何量词的正则)
顺序环视相当于在当前位置右侧附加一个条件,而逆序环视相当于在当前位置左侧附加一个条件。
表达式 | 说明 |
(?<=Expression) | 逆序肯定环视,表示所在位置左侧能够匹配Expression |
(?<!Expression) | 逆序否定环视,表示所在位置左侧不能匹配Expression |
(?=Expression) | 顺序肯定环视,表示所在位置右侧能够匹配Expression |
(?!Expression) | 顺序否定环视,表示所在位置右侧不能匹配Expression |
对于环视的叫法,有的文档里叫预搜索,有的叫什么什么断言的,这里使用了更多人容易接受的《精通正则表达式》中“环视”的叫法.
源字符串:aa<p>one</p>bb<div>two</div>cc
正则表达式:<(?!/?p\b)[^>]+>
这个正则的意义就是匹配除<p…>或</p>之外的其余标签。
(?!/?p\b) ----->匹配左侧不能为 "p" 或者 "/p" (/b代表的单词分界);
说到匹配位置,就不能不说 ^ $ \b , ^-----> 文本首部
$-----> 文本尾部
\b-----> 单词分界 ("\<" "\>" 也是单词分界,分别代表的是左分界,右分界)
4,捕获型括号和非捕获型货号 "(),(?:)" ; (非捕获括号又叫仅用于分组型括号)
顾名思义 一个会被捕获,一个不会被捕获。捕获主要用来 替换文本,和反向引用。
5, 固化分组 (?>......) 和 占有优先 量词添加一个"+" 例: "?+"
这两者会取消回溯。
固化分组: 捕获文本后,不会回溯,即不会将已匹配的文本交出来。
6, 匹配优先,忽略优先
普通的量词 都是匹配优先的。 如: ?,* ,+ ,{}
忽略优先 则应该对应为 ??,*?,+?,{}?
占有优先 则为 ?+,*+,++,{}+;
无论 忽略优先还是匹配优先 都会以 匹配成功为最大优先级,都会产生回溯。
占有优先则不然,他是一个剑客,宁愿匹配失败也不会产生回溯
7, 回溯
上文都有提到这个概念,其实就是一个面包屑的概念。
多选项,字符组,量词 都会引起回溯。
8,引擎类别。
NFA:(非确定型有穷自动机) 表达式主导,灵活性高,对程序员要求高。
DFA:(确定性有穷自动机) 文本主导,没有回溯。
各种语言支持的引擎:
ps:回首一看,好像只是记录了一些基本理论,可能是刚开始写博客,有点生疏,权当自己学习路的一个记忆点吧。另希望自己能慢慢进步。
面包屑之正则表达式