表达式的构造细节
特殊字符
具体文本
解释顺序-
针对的对象(什么工具软件)
正则表达式字符构成
match 匹配
metacharacter 元字符
normal text character 解释正则表达式按照字符来理解
接下来是and then
character set 字符组
alternative 多选分支 --自身可以是完整的正则表达式
位置:anchor 锚定
行开头 ^
行结尾 $
字符开头 \< 并不是所有语言支持,注意
字符结尾 \>
\b
( ) 使用括号来划定多选结构的范围,以及限制多选分支;分组 ;捕获文本
数量
quantifiers 量词
? 0或1个
* 0或多个
+ 1或多个
interval quantifier 区间量词
{n} =n
{n,m} n<= <=m
{n,} >=n
{,m} <=m
字符
. 任意字符
排序-预定义字符类
大小写 是够忽略大小写 egrep -i 参数 忽略大小写
字符组
[ ] 字符组
[^ ] 排除型字符组 匹配一个未列出的字符
[a-z] [A-Z] [A-Za-z]
[0-9]
[A-Za-z0-9]
字符组和字符
[ - ] 字符组元字符,必须在字符组中,且位于字符中间
. ? 在字符组中是普通字符
内外有别
转义字符
\ backslash 反斜线-- escape 转义符
其他概念
backreference 反向引用 特殊元字符序列 \1
正则表达式的解读方式
Linux上的命令
基础正则表达式
Basic Regular Expression,具有更加严谨的字符串表示方式,其典型辅助程序命令为gre
扩展正则表达式
Extend Regular Expression,具有更加广泛和简便的使用模式,其典型辅助程序命令为egrep。
Flavor 流派-了解技术渊源
1.支持的元字符和这些元字符的意义
2.与宿主语言的交互方式
3.正则表达式的引擎,以及如何应用到文本
所使用的引擎的类型,决定了引擎能够支持的特性以及这些特性的用途
历史
正则集合--正则表达式--正则表达式编译器
正则表达式--词法分析
编译原理--语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成
程序设计语言的本质
Henry Spencer 正则表达式包
POSIX
locale -- 让程序变得国际化
Basic Regular Expressions
Extended Regular Expressions
正则表达式的处理方式:
集成式
perl 的集成式
=~ m/^Subject:(.*)/i
程序式
面向对象式
由构造函数及其方法提供
例如java包提供两个类-Pattern和Matcher
import java.util.regex.*;
Pattern r = Pattern.compile("",Pattern.CASE_INSENSTIVE);
Matcher m = r.matcher(line);
函数式
由普通函数提供
正则表达式原理
Finite Automation
当前状态读入一个字符后,和后继状态的转换- (状态-字母表 输入字符-初态集--状态转移矩阵-终态集 )
后继状态为自身
后继状态只有一个
后继状态有多个
如果每次转换后继状态唯一,则 Deterministic DFA
反之则 Nondeterministic NFA
NFA 有若干初始状态,允许接受字 ,多值映射
DFA- 文本主导 text-directed 确定性有穷自动机
DFA对于文本串里的每一个字符只需扫描一次,比较快,但特性较少
最长的左子正则式优先匹配成功”
NFA- 表达式主导 regex-directed 非确定性有穷自动机
速度慢,但是特性丰富
支持lazy和backreference等特性
最左子正则式优先匹配成功,因此偶尔会错过最佳匹配结果
引擎分类的具体语言
DFA
awk egrep MySQL
NFA--传统型
Java、Python 、Perl 、PHP 、
GNU Emacs 、vi、
grep 、sed 、
NFA--POSIX型
混合
GNU awk、GNU grep/egrep
编辑文本的正则表达式
01.UltraEdit
UltraEdit的正则表达式
删除多余空行。
删除空行: 替换 %[ ^t]++^p 为 空串
删除行尾空格: 替换 [ ^t]+$ 为 空串
删除行首空格: 替换 %[ ^t]+ 为 空串
UltraEdit
perl的正则表达式
1.非某个字符开头的全部替换为空--perl
^(?!create table).*$
^(?!create table).*$
^是字符串开头,(?! ) 是否定环视,意思是后面不是……
2.例如
^(?!drop|--).*$
3.多个连续的空格替换成一个空格
[ ]+
02.Editplus
^Nov.*$
空白行
^[ \t]*\n ^[ \t]*\n是一行空白行的正则表达式,多次点击全部替换
附录:
1.框架性知识和具体知识
框架性知识:系统的学习和阅读
具体知识: 实践积累
2.表达式的基本模型和解决问题的基本思路
以可能未曾想过的方式解决问题
3. 支持正则表达式
操作系统
文本编辑工具
主流编程语言
4. 学习过程
照猫画虎--融会贯通
5.比较异同
正则表达式 regular expression
通配符 wildcards
参考