已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
正则表达式和字符串处理 第一章 正则表达式概述正则表达式概述 正则表达式 Regular Expression 起源于人类神经系统的研究 正则表达式的定义有以下几 种 用某种模式去匹配一类字符串的公式 它主要是用来描述字符串匹配的工具 描述了一种字符串匹配的模式 可以用来检查字符串是否含有某种子串 将匹配的子 串做替换或者从中取出符合某个条件的子串等 由普通字符 a z 以及特殊字符 元字符 组成的文字模式 正则表达式作为一个模版 将某个字符模式与所搜索的字符串进行匹配 用于描述某些规则的的工具 这些规则经常用于处理字符串中的查找或替换字符串 也就是说正则表达式就是记录文本规则的代码 用一个字符串来描述一个特征 然后去验证另一个字符串是否符合这个特征 以上这些定义其实也就是正则表达式的作用 第二章第二章 正则表达式基础理论正则表达式基础理论 这些理论将为编写正则表达式提供法则和规范 正则表达式主要包括以下基础理论 元字符 字符串 字符转义 反义 限定符 替换 分组 反向引用 零宽度断言 匹配选项 注释 优先级顺序 递归匹配 2 1 元字符 在正则表达式中 元字符 Metacharacter 是一类非常特殊的字符 它能够匹配一个位置 或字符集合中的一个字符 如 w 等 根据功能 元字符可以分为两种类型 匹配位置 的元字符和匹配字符的元字符 2 1 1 匹配位置的元字符 包括 和 b 其中 脱字符号 和 美元符号 都匹配一个位置 分别匹配行的 开始和结尾 比如 string 匹配以 string 开头的行 string 匹配以 string 结尾的行 string 匹配以 string 开始和结尾的行 单个 匹配一个空行 单个 匹配任意行 b 匹配单 词的开始和结尾 如 bstr 匹配以 str 开始的单词 但 b 不匹配空格 标点符号或换行符 号 所以 bstr 可以匹配 string string fomat 等单词 bstr 正则表达式匹配的字符串必 须以 str 开头 并且 str 以前是单词的分界处 但此正则表达式不能限定 str 之后的字符串 形式 以下正则表达式匹配以 ing 结尾的字符串 如 string This is a string 等 Ing b 正则表达式 ing b 匹配的字符串必须以 ing 结尾 并且 ing 后是分界符 以下正则表达式匹 配一个完整的单词 bstring b 2 1 2 匹配字符的元字符匹配字符的元字符 匹配字符的元字符有 7 个 点号点号 w W s S d 和和 D 其中 其中点号匹配除换行之外 的任意字符 w 匹配单词字符 包括字母 汉字 下划线和数字 W 匹配任意非单词 字符 s 匹配任意的空白字符 如空格 制表符 换行等 S 匹配任意的非空白字符 d 匹配任意数字字符 D 匹配任意的非数字字符 如 匹配一个非空行 在该行中可以包含除了换行符以外的任意字符 w 匹配一个非空行 并且该行中只能包含字母 数字 下划线和汉字中的任意字符 ba w w w w w w b 匹配以字母 a 开头长度等于 7 的任意单词 ba w w w d d d D b 匹配以字母 a 开头后面有 3 个字符三个数字和 1 个非数字字符长度等 于 8 的单词 2 2 字符类字符类 字符类是一个字符集合 如果该字符集合中的任何一个字符被匹配 则它会找到该匹配项 字符类可以在 方括号 中定义 如 012345 可以匹配数字 0 到 5 中的任意一个 可以匹配 HTML 标签中的 H1 到 H6 Jj ack 可以匹配字符串 Jack 或 jack 但是 由于表达式 0123456789 书写非常不方便 连字符 便应用而生 0 9 等价于 0123456789 a z 匹配任何小写字母 A Z 匹配任意大写字母 如果要在字符类中包含 连字符 则必须包含在第一位 如 a 表示表达式匹配 或者 a 在字符类中如果 是字符 类的第一个字符表示否定该字符串 也就是匹配该字符串外的任意字符 如 abc 匹配 除了 abc 以外的任意字符 匹配除了连字符以外的任意字符 a b 匹配 a 之后不是 b 的字符串 表 2 1 常用的字符类 字符或表达式说明 w 匹配单词字符 包括字母 数字 下划线和汉字 W 匹配任意的非单词字符 包括字母 数字 下划线和汉字 s 匹配任意的空白字符 如空格 制表符 换行符 中文全角空格等 S 匹配任意的非空白字符 d 匹配任意数字 D 匹配任意的非数字字符 abc 匹配字符集中的任何字符 abc 匹配除了字符集中包含字符的任意字符 0 9a z A Z 匹配任何数字 字母 下划线 等同于 w p name 匹配 name 指定的命名字符类中的任何字符 P name 匹配除了 name 指定的命名字符类中之外的任何字符 匹配除了换行符号之外的任意字符 0 9a zA Z 等同于 W 2 32 3 字符转义字符转义 表 2 2 常用的转义字符 表达式可匹配 r n 代表回车和换行符 t 制表符 代表 本身 还有其他一些在后边章节中有特殊用处的标点符号 在前面加 后 就代表该符号本身 比如 都有特殊意义 如果要想匹配字符串中 和 字符 则表达式就需要写 成 和 表达式可匹配 匹配 符号本身 匹配 符号本身 匹配小数点 本身 2 4 反义反义 在使用正则表达式时 如果需要匹配不在字符类指定的范围内的字符时 可以使用反义规 则 其实我们已经使用过反义表达式 如 W S D abc 等 常用的反义表如下 表 2 3 常用的反义表达式 字符或表达式说明 W匹配任意不是字母 数字 下划线 汉字的字 符 S匹配任意不是空白符的字符 D匹配任意非数字的字符 B匹配不是单词开头或结束的位置 x 匹配除了 x 以外的任意字符 aeiou 匹配除了 aeiou 这几个字母以外的任意字符 2 4 限定符限定符 正则正则表达式的元字符一次只能匹配一个位置或一个字符 如果需要匹配零个一个或多个字 符时 则需要使用限定符 限定符用于指定允许特定字符或字符集自身重复出现的次数 如 n 表示出现 n 次 n 表示重复至少 n 次 n m 表示至少出现 n 次最 多 m 次 常用限定符如下表 表 2 4 常用限定符 字符字符描述描述 匹配前面的子表达式零次或多次 例如 zo 能匹配 z 以及 zoo 等价于 0 匹配前面的子表达式一次或多次 例如 zo 能匹配 zo 以及 zoo 但不能匹配 z 等价于 1 匹配前面的子表达式零次或一次 例如 do es 可以匹配 do 或 does 中的 do 等价于 0 1 n n 是一个非负整数 匹配确定的 n 次 例如 o 2 不能匹配 Bob 中 的 o 但是能匹配 food 中的两个 o n n 是一个非负整数 至少匹配n 次 例如 o 2 不能匹配 Bob 中的 o 但能匹配 foooood 中的所有 o o 1 等价于 o o 0 则等价于 o n m m 和 n 均为非负整数 其中n m 最少匹配 n 次且最多匹配 m 次 刘 o 1 3 将匹配 fooooood 中的前三个 o o 0 1 等价于 o 请 注意在逗号和两个数之间不能有空格 尽可能少的使用重复的第一个匹配 尽可能少的使用重复但至少使用一次 如果有可能使用零次重复或一次重复 n 等同于 n n 尽可能少的使用重复但至少重复 n 次 n m 介于 n 次和 m 次之间 尽可能少的使用重复 2 5 贪婪 惰性和支配性匹配贪婪 惰性和支配性匹配 惰性匹配 先看字符串中的第一个字母是不是一个匹配 如果单独一个字符还不够就读入 下一个字符 如果还没有发现匹配 就不断地从后续字符中读取 只道发现一个合适的匹 配 然后开始下一次的匹配 贪婪匹配 先看整个字符串是不是一个匹配 如果没有发现匹配 它去掉字符串中最后一 个字符并再次尝试 如果还没有发现匹配 那么再次去掉最后一个字符 这个过程会一直 重复直到发现一个匹配或字符串不剩一个字符为止 支配性匹配 只尝试匹配整个字符串 如果整个字符串不能产生一个匹配 则不再进行尝 试 我们普通的字符类均是贪婪匹配 如果在字符类后加个问号 则表示懒惰匹配 要成为支 配性匹配则在懒惰匹配后加个问号 2 6 替换替换 正则表达式 0 d 2 d 8 和 0 d 3 d 7 分别匹配区号为 3 位和 4 位的固定电话号码 如果 需要同时匹配区号为 3 位和 4 位的固定电话号码 可以使用替换满足这一需求 最简单的 替换是使用竖线 表示 以下表达式匹配了区号为 3 位号码为 8 位和区号为 4 位号码为 7 位的的电话号码 区号和号码均使用 连接 0 d 2 d 8 0 d 3 d 7 表 2 5 常用替换 字符或表达式说明 匹配竖线 左侧或右侧 表达式 yes no 表达式要么与 yes 部分匹配要么与 no 部分 匹配 其中 no 部分可以省略 name yes no 以 name 命名的字符串要么与 yas 部分匹配 要么与 no 部分 pp 其中 no 部分可以省略 2 7 分组分组 分组又分组又称为子表达式 即把一个正则表达式的全部或部分分成一个或多个组 其中分组使 用圆括号 分组后把圆括号中的表达式看做一个整体来处理 比如 abc 1 2 表示 abc 出现一次或两次的字符串 其中把 abc 看做一个整体来进行匹配 2 8 后向引用后向引用 当一个正则表达式被分组后 每一个组将自动被赋予一个组号 该组号可以代表该组的表 达式 其中 组号的编制规则为 从左到右 以分组的左括号为标志 第一个组号为 1 第二个分组号为 2 以此类推 如 A B C 将产生 3 个组号 第一组为 A B C 第二组为 B C 第三组为 C 反向引用提供了查找重复字符组的方便方法 反向引用可以使用数字命名 默认名称 的 组号 也可以使用指定命名的组号 比如 b w 1 b 匹配两个字符一样的单词 此表达式 和 b w w b 不一样 后者两个字符可以不一样 再看 b w d 1 2 b 匹配一个字符和 一个数字然后重复字符和数字 b w w 1 b 匹配以至少两个字符一样结尾的单词 b w b s 1 b 此正则表达式匹配的具体过程如下 a 表达式 b w b 匹配一个单词并且单词的长度至少为 1 b 表达式 s 匹配一个或多个空白字符 c 表达式 1 将重复子表达式 w 匹配的内容 及匹配重复的单词 d 匹配单词的结束位置 分组不仅可以使用数字作为组号 还可以使用自定义名称作为组号 以下两个正则表达式 都是将分组后的子表达式 w 命名为 word w word w 因此 b w b s 1 b 和以下正则表达式是等价的 都匹配重复的单词 b w b s k b 表 2 5 后向引用说明表 表达式说明 数字使用数字命名的后向引用 k 使用指定命名的后向引用 表 2 6 常用分组说明 字符说明 expression 匹配字符串 expression 并将匹配的文本保存到自动命名的组里 expression 匹配字符串 expression 并将匹配的文本保存到以 name 命名的变 量中 该名称不能包含标点符号 不能以数字开头 expression 匹配字符串 expression 不保存匹配的文本 也不分配组号 expression 匹配后面不是字符串 expression 的位置 expression 匹配字符串 expression 前面的位置 expression 匹配字符串 expression 后面的位置 expression 只匹配 expression 一次 2 9 零宽度断言零宽度断言 元字符 b 都匹配一个位置 并且这个位置满足一定条件 在此把满足一个条件称为 断言或零宽度断言 正则表达式中零宽度断言说明如下表 表 2 6 零宽度断言 字符 断言 说明 匹配行的开始位置 匹配行的结束位置 A 匹配必须出现在字符串的开头 Z 匹配必须出现在字符串的结尾或字符串结尾处的换行符 n 前 z 匹配必须出现在字符串的结尾 G 匹配必须出现在上个匹配结束的地方 b 匹配单词的开始或结束的位置 B 匹配不是单词的开始或结束的位置 表达式 expression expression expression 和 expression 都是匹配一 个位置 下面将详细介绍表达式 expression 和 expression expression 又称为零宽度正预测先行断言 它断言自身位置的前面能够匹配表达式 expression 以下正则表达式匹配以 ed 结尾的单词的前面部分 b w ed b expression 又称为零宽度正回顾后发断言 它断言自身位置的后面能够匹配表达式 expression 以下正则表达式匹配以 an 开头的单词的后面部分 即匹配单词除了字符串 an 之外的部分 ban w b 2 10 负向零宽度断言负向零宽度断言 零宽度断言只能指定或匹配一个位置 而负向零宽度断言与零宽度断言正好相反 它能指 定或匹配不是一个位置 即所说的反义 特别是在匹配字符串中不包含指定的字符时 负 向零宽度断言特别有用 比如要匹配断言字符 a 之后不能是字符 b 的表达式为 b w a b w b 因此该表达式匹配一个单词 并且这个包含字符 a 并且 a 后面不是紧随着 b 表达式 expression 称为负向零宽度断言 它断言自身位置后不能包含 expression 以下 正则表达式匹配一个 z 字符串 字符串前三位为字符并且后边不是紧随着数字 b w 3 d 表达式 expression 称为零宽度回顾后发断言 它断言自身位置的前面不能匹 配字符串 expression 以下表达式匹配不以数字开头 并且字符串中只包含大写字母 小 写字母或下划线 d a z A Z 2 11 匹配选项匹配选项 匹配选项可以指定正则表达式匹配中的行为 如忽略大小写 处理多行 处理单行 从右 到左开始匹配等 常用的匹配选项如下 表 2 7 常用匹配选项 RegexOptions 枚举值内联标志 简单说明 ExplicitCapturen只有定义了命名或编号的组才捕获 IgnoreCasei不区分大小写 IgnorePatternWhitespac e x消除模式中的非转义空白并启用由 标记的注释 MultiLinem多行模式 其原理是修改了 和 的含义 SingleLines单行模式 和 MultiLine 相对应 2 12 优先级优先级 正则表达式从左到右进行计算 并遵循优先级顺序 这与算术表达式非常类似 下表从最 高到最低说明了各种正则表达式运算符的优先级顺序 表 2 8 优先级说明 运算符运算符说明说明 转义符 括号和中括号 n n n m 限定符 anymetacharacter anycharacter 定位点和序列 替换 字符的优先级比替换运算符高 替换运算符允许 m food 与 m 或 food 匹配 若要匹配 mood 或 food 请使用括号创建子表达式 从而产生 m f ood 2 12 递归匹配递归匹配 递归匹配在匹配具有嵌套结构的字符串时特别有效 比如算术表达式 1 2 3 4 具有嵌 套结构 如果要使用正则表达式检查该表达式是否正确 则可以使用递归匹配解决该问题 这里介绍的平衡组语法是由 Net Framework 支持的 其它语言 库不一定支持这种功能 或者支持此功能但需要使用不同的语法 有时我们需要匹配像 100 50 15 这样的可嵌套的层次性结构 这时简单地使用 则只会匹配到最左边的左括号和最右边的右括号之间的内容 这里我们讨论的是贪婪模式 懒惰模式也有下面的问题 假如原来的字符串里的左括号和右括号出现的次数不相等 比如 5 3 2 那我们的匹配结果里两者的个数也不会相等 有没有办法在这 样的字符串里匹配到最长的 配对的括号之间的内容呢 为了避免 和 把你的大脑彻底搞糊涂 我们还是用尖括号
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国际职业经理资格标准认证学会市场营销学教案(2025-2026学年)
- 数据库恢复教案(2025-2026学年)
- 满堂装饰脚手架专项施工方案试卷教案(2025-2026学年)
- 艾滋病职业暴露处置要求和流程教案(2025-2026学年)
- 春五年级数学下册邮票的张数北师大版教案(2025-2026学年)
- 高考历史大一轮历史线性思维训练一新人教版教案(2025-2026学年)
- 幼儿园小班主题课教案想变蝴蝶的毛毛虫含反思(2025-2026学年)
- 《绿豆苗的生长》教科版五年级科学下册教案(2025-2026学年)
- 四季之美教案(2025-2026学年)
- 幼儿园中班健康课教案详案不乱吃东西含反思(2025-2026学年)
- 儿童儿童矮身材临床诊治矮身材临床诊治
- 招标文件范本三篇
- 心衰病例分享演讲比赛课件
- JT-T-1344-2020纯电动汽车维护、检测、诊断技术规范
- 临床技术操作规范重症医学分册资料
- ISO 15609-1 2019 金属材料焊接工艺规程和评定-焊接工艺规程-电弧焊(中文版)
- 2024年山西省职业院校技能大赛(中职组)护理技能赛项考试题库含答
- 《劳动》五年级下册教学课件 9 学做刺绣
- 妇产科专科的发展与建设规划
- 初中八年级数学课件-两点间的距离公式
- 妊娠合并心衰课件
评论
0/150
提交评论