book_正则表达式从入门到精通

感觉正则能力太差了,每天花一个小时看看咯。

1.什么是正则表达式?

? *
? 匹配单个字符,* 匹配多个字符

2.使用正则表达式

search   比如 对输入字符串进行测试,看该字符串是否存在一个电话号码或者一个信用卡号模式。 称为 数据有效性验证。
replace  标识 文档中特定文字,将其全部替换或者删除。
对一个正则表达式模式 或者 部分模式 两边添加圆括号,将导致 这部分表达式 被存储到一个临时缓冲区。可以使?:,?=,?! 来胡磊对这部分正则表达式的存储。
    所捕获的每一个子匹配,都按照 正则表达式模式 中 从左至右 所遇到的内容进行存储。 存储子匹配的缓冲区编号 1 到 99 .    每个缓冲区 都可以 通过\n访问。n为标识    
    特定缓冲区的一个或者两位十进制。
  • 需要搜索整个web站点,删除某些过时材料,并替换某些HTML格式化标记。
    1. 使用正则表达式 对每个文件 进行测试 。查看该 文件是否 是要删除的材料 或者 含有HTML 格式化标记
    2. 将 受影响的文件 范围,缩小到 包含 删除和 替换 的材料的 文件。
    3. 使用增则表达式 删除过时文件
    4. 使用正则表达式 替换 标记。

3.正则表达式语法

 一个正则表达式 是由普通字符 以及特殊字符 组成的文字模式

4.标记说明

  • ^     匹配字符串开始位置。如果设置了RegExp 对象的Multiline 属性,^ 也匹配 \n 或者 \r 之后的位置。
    
  • $     匹配 字符串结束的位置。如果设置RegExp 对象的Multiline属性。$ 也匹配\n 或者\r的之前的位置。
    
  • * 匹配0次或者多次
  • + 匹配一次或者多次
  • ? 匹配0次或者1次
  • {n} 匹配确定N次
  • {n,} 匹配至少N次。
  • {n,m} 匹配至少n次,最多M次。
  • ? 紧跟在任何其他限制符后面,+?,??,{n}?,{n,}?,{n,m}? 匹配模式是非贪婪的。 非贪婪,尽可能少的匹配所搜索的字符。默认贪婪模式,尽可能多的匹配字符。
    如:oooooo, o+? .匹配一个o, o+,匹配所有o.
  • . 匹配除\n外的,任何单个字符。如果要匹配\n 在内的 任何字符,请使用 [.\n] 模式。
  • (pattern) 获取匹配
  • (?:pattern) 匹配但不获取。使用| 来租个模式的各个部分很有用。如 industr(?:y|ies) 就比 industry|industries 是个更简略的表达式。
  • (?=pattern) 正向预查,在任何匹配pattern的字符串处,开始处,匹配查找字符串。非获取匹配。不消耗字符串。
  • (?!pattern) 负向预查 ,在任何不匹配pattern 的字符串开始处,匹配查找字符串。非获取匹配。不消耗字符串。
  • x|y 匹配x或者y
  • [xyz] 字符集合,匹配所包含的任何一个字符
  • [^xyz] 负值字符集和 匹配未包含的任何字符
  • \b 匹配一个单词边界 即单词和空格间的位置。
  • \B 匹配非边界单词。 er\B ,能匹配verb 中的er,不能匹配 never 中的 er.
  • \d 匹配一个数字字符 等价于[0-9]
  • \D 匹配一个非数字字符 等价于[^0-9]
  • \w 匹配包含下划线的任何单词字符。等价于[a-zA-Z0-9_]
  • \W 匹配任何非单词字符。 等价于[^a-zA-Z0-9_]
  • \s 匹配任何空白字符。 等价于[\f\n\t\r\v]
  • \S 匹配任何非空白字符。 等价于[^\f\r\t\v\n]
  • \n 匹配换行符 等价于 \x0a
  • \r 匹配一个回车符 等价于\x0d
  • \t 匹配一个制表符
  • \v 匹配一个垂直制表符
  • \f 匹配一个换页符 等价于 \x0c.

4.建立正则表达式

表达式建立:在一对 分隔符 之间 放入表达式模式的 各种组件来构造一个正则表达式。

1. 优先级顺序

  • \
  • (),(?=),(?😃,[]
  • *,+,?,{n},{n,},
  • ^,$,\anymet
  • |

2.定位符

  • ^ 匹配输入字符串开始位置。如果设置了RegExp的Multiline属性,也匹配\n,和 \r 之后的位置
  • $ 匹配输入字符串结束的位置。如果设置了RegexExp的Multiline属性,也匹配\r或者\n之前的位置
  • \b 匹配一个单词边界。指单词和空格间的位置
  • \B 匹配非单词边界。

5.实例

  1. 标记一个HTML标记 <(.)>.</\1>
  2. 匹配do 和 does 。do(es)?
  3. 匹配章节:^Chapter [1-9]\d{0,1}$ .缺点,产生了副作用。Chapter|Section 两边加括号,家里了编组,但是 两个待匹配项会被捕获,供今后使用。而我们真正想做的是,使用圆括号,对Chapter 或 Section 之间的选择编组。并不希望后面再引用该匹配。如果不需要尽量不要使用。不需要花时间和内存来存储子匹配。效率低。
    可以加 ?: 来防止存储该匹配供以后使用。 修改后 :^(?:Chapter|Section) [1-9]\d{0,1}$
  4. 去重复:/\b(\w+) \1\b /gi .Is is the cost of of gasonline going up up? . \1 用来指定第一个子匹配。var res=str.Replace("/\b(\w+) \1\b/gim","$1"). 用一个单词来代替两个单词。replace中,用 $1 来引用所保存的第一个子匹配。
  5. 网址匹配分解。 /(\w+)😕/([/:]+)(:\d*)?([#]*)/. http://csdn.microsoft.com:80/scripting/default.html.
    子匹配包含的内容: RegExp.$1="http" ,RegExp.$2="csdn.microsoft.com", RegExp.$3=":80" , RegExp.$4="/scripting/default.html"
posted @ 2018-06-19 09:54  sujingnuli  阅读(153)  评论(0编辑  收藏  举报