`
sqj47sqj
  • 浏览: 30743 次
社区版块
存档分类
最新评论

正则表达式基础知识

 
阅读更多

  本文内容主要选自 《正则表达式必知必会》, 薄薄的书(100页左右),信息量却很大,非常适合正则表达式入门.
  正则表达式测试小软件下载地址: http://www.forta.com/books/0672325667
  一、 概述
  1. 正则表达式是用来描述文本的模式结构的表达式,是由正则表达式语言写成的由特殊字符、普通字符组合而成的具有特定含义的字符串。
  比如 单个数字的正则表达式是 [0-9] 或 \d ; 三位数字的正则表达式是 [0-9][0-9][0-9] 或 \d{3}。由上可见,
  2. 一个文本模式可能有多种正则表达式写法,有的简单,有的快速,有的功能全面,有的兼容性好,要多多尝试。
  3. 正则表达式是"文本内匹配" , 比如,文本 shuqin1984 , 正则表达式 \d{4} 将在整个文本中匹配 1984 部分。 
  4. 正则表达式的一个难点是: 要匹配期望的文本比较容易,但要将不期望的东西排除掉比较困难。比如三位数,若写成
  \d{3}, 则虽然所有三位数都囊括进去,但不合法的格式文本比如 001, 023 也包含进去了。正确的写法是: [1-9]\d{2}
  因此,使用正则表达式之前,对要匹配的文本的模式结构和规则要有清晰明确的归纳,以防漏掉要匹配的文本,
  却将不期望的文本匹配进去。    
  5. 掌握正则表达式语法相对容易,更重要的是灵活应用,多多实践。
  二、 匹配单个字符
  1. 匹配任意单个字符: .  比如 sa. 可以匹配  sa 后跟任意字符的字符串 
  2. 匹配指定字符集合中的任意单个字符: 比如 [abc] 将匹配 a 或 b 或 c , ca[ptb] 将匹配 cap, cat 或 cab.
  3. 匹配指定字符集合之外的任意单个字符: 比如 [^abc] 将匹配除了 a,b,c 之外的任意单个字符。 
  ca[^ptb],将匹配 caX 的任意文本,除了 cap, cat, cab
  实验: 
  sales.xls order3.xls sales2.xls sales3.xls apac1.xls europe2.xls sam.xls
  saM.XLS na1.xls na2.xls sa1.xls ca1.xls
  正则表达式: sa. sa[lm]  sa[^lm]  [ns]a[1-2] [ns]a[^1-2]
  4. 匹配特殊字符: 需要用 \ 进行转义,比如匹配 . 的正则式是 \. , 匹配 \ 的正则式是 \\, 匹配 ( 的正则式是 \(
  凡是在正则式中具有特殊含义的字符,要匹配字符本身(将其作为普通文本)都必须进行转义.
  通常需要转义的字符有: . + * ? { } [ ] ( ) - \ ^ $
  文本同上。 正则表达式 sa.\.xls  sa[mlM]\.xls  sa[^mlM]\.xls 
  5. 匹配空白字符: \f 换页 \n 换行 \r 回车 \t 制表符 \v 垂直制表符  空格符
  实验文本: 
  (x+y)^n = C(n,0)x^n + C(n,1)x^(n-1)*y + ... + C(n,k)x^(n-k)*y^k + ... + C(n,n-1)x*y^(n-1) + C(n,n)y^n
  正则表达式: C(.,.) C\(.,.\) \+ \s+\+\s+  x\^\(n(-[0-9a-z])?\)
  6. 匹配字符区间集合的任意单个字符: 
  [0-9] 任意数字   [a-z] 任意小写字母 [A-Z] 任意大写字母 [a-f] a,b,c,d,e,f 
  [a-zA-Z] 任意大小写字母  [^0-9] 任意非数字的字符 [^a-zA-Z] 任意非大小写字母的字符
  7. 匹配特殊字符集合中的任意单个字符:  等价于
  \d  [0-9] 任意单个数字  \D  [^0-9] 任意单个的非数字字符
  \w  [a-zA-Z0-9_]      \W  [^a-zA-Z0-9_] 
  \s  [\f\n\r\t\v ]      \S  [^\f\n\r\t\v ]
  实验: 
  
  正则表达式: [0-9a-fA-F]{6}|[0-9a-fA-F]{3} 匹配 336633 和 FFF 
  8. POSIX 字符类: 例如:
  [:digit:]  [0-9] ; [:alpha:]  [a-zA-Z] ; [:alnum:]  [a-zA-Z0-9] 
  具体应用要再加一层括号,比如 TEST[[:digit:]] 匹配 TEST0 - TEST9
  三、 匹配字符组合
  1. XY: 匹配 X 后跟 Y 的文本,比如 [0-9][a-z] 匹配 数字后跟小写字母的文本, 7z, 0x 等, 但不匹配 ap, 77
  2. X|Y: 匹配 X 或者 Y ,比如 [0-9]|[a-z] 匹配数字或小写字母,相当于 [0-9a-z] 
  3. 匹配一个或多个 X : X+ ; 例如 s\d+ 匹配 s后跟至少一个数字, s9, s34, s235, ... 
  匹配零个或多个 X : X* ;  例如 s\d* 匹配 s后跟空或者至少一个数字, s, s9, s34, s235, ...
  匹配零个或一个 X : X?; 例如 https? 匹配 http 或 https
  匹配恰好 m 个 X : X{m} ; 例如 s\d{4} 匹配 s0000, s1234, 但不匹配 s234, s23445
  匹配至少 m 个 X : X{m,} ; 例如 s\d{2,} 匹配 s12, s123, 但不匹配 s1
  匹配至少 m 个 但不超过 n 个X: X{m,n} ; 例如 s\d{2,4} , 匹配 s12, s123, s1234, 但不匹配 s1, s12345
  4. 以上 X 可以是一个子表达式: 例如 (s\d){3} 匹配 s1s1s1 ,而不匹配 s111
  实验: 
  s , s1, s12, s123, s1234, s12345, s123456, ... s111, s1s1s1, s2s2, s22, s3333, s3s3s3s3, ...
  正则表达式: s\d*, s\d+, s\d? s\d{3}, s\d{2,} s\d{2,4}, 
  (s\d)* , (s\d)+, (s\d)?, (s\d){3}, (s\d){2,}, (s\d){2,4},
  5. 惰性匹配: 默认匹配模式是"贪婪型匹配",即匹配尽可能多的文本
  实验:  You  make  me  lost. 
  正则式: .*  .*?  (?).*?(?=)
  6. 匹配位置: 
  [1] \b 单词边界 \B 非单词边界。
  文本: The captain wore his cap and cape proudly as he sat listening
  to the recap of how his crew saved the men from a capsized vessel.
  正则式: cap \bcap cap\b \bcap\b \Bcap cap\B \Bcap\B           
  [2] ^ 匹配文本起始 $ 匹配文本末尾
  例如 ^[a-z]123 将匹配文本 a123 而不是 slh a123 即以小写字母开头后跟123的文本 
  [a-z]123$ 将匹配文本 sss d123 而不是 sdf123dss 即以小写字母后跟123结尾的文本
  实验: a123 a123 sss a123
  正则式: ^a123 a123$
  7. 子表达式: 使用括号将一个正则表达式作为整体
  例如: 三位数.三位数.三位数.三位数 : (\d{1,3}\.){1,3}\d{1,3} ; (\d{1,3}\.) 就是一个子表达式    
  例如: IP 地址: 0-255.0-255.0-255.0-255 ,这里关键是表达 0-255 中的任意数字
  将 0-255 划分为几个区段: 0-9, 10-99, 100-199, 200-249, 250-255
  (\b([0-9]|([1-9][0-9])|(1\d{2})|(2[0-4][0-9])|(25[ 0-5]))\.){3}
  ([0-9]|([1-9][0-9])|(1\d{2})|(2[0-4][0-9])|(25[0-5 ])) 
  实验: 122.204.142.1 192.168.1.1 127.0.0.1  122.375.86.2
  375.122.45.2  122.204.256.1 122.23.21.256 
  8. 回溯引用: 相同匹配的概念
  例如: 匹配 .*? 这里 \1 可以捕获 ([hH][1-6]) 所得到的结果,从而起到对应的效果,以免匹配到
  23 的不合法文本。即,若  则 \1 表示 h1,  若 则 \1 表示 H2
  文本:  HELLO WORLD    WA O     YEAH 
  正则式: .*?   .*? 
  引用: ((regex1)-(regex2))-(regex3) \n n 按左括号出现的顺序进行标识 
  \0 表示匹配的整个文本 \1 ((regex1)-(regex2)) \2 (regex1) \3 (regex2) \4 (regex3)
  在替换文本时可以使用 $1, $2, $3, $4 分别引用 \1, \2, \3, \4 捕获的文本。
  例如: 正则表达式 ((abc)-(def))-(ghf)  匹配文本  abc-def-ghf
  $1 ---> abc-def   ;   $2 ---> abc   ;  $3 ---> def   ;  $4 ---> ghf   
  9. 前后查找: 位置匹配的概念
  比如: 要查找 scatter locate rocate 中 cat 后面是 e 的单词,使用 cat(?=e), 注意,这里并不会捕获e,而是用e作为捕获 cat 的定位信息; 要查找 cat 前面是 s 的单词, 使用 (?正则式: ((https?)|(ftp))(?=:)  
  10. 嵌入条件: 条件匹配的概念
  比如,要匹配 (123)456-7890 或 123-456-7890 ,而不匹配 (123)-456-7890, 123456-7890 , (123-456-7890 等,
  这意味着,若123前面是 ( 则后面要匹配 ) 且不跟 - ; 若 123前面不是 ( , 则后面匹配 - 
  正则表达式是: (\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
  (\()? 表示是否存在 ( , 这里用括号将 ( 作为子表达式,以便于后面回溯引用;  
  (?(1)\)|-) 表示,如果存在 ( ,则匹配 ) ,否则匹配 - 
  ?(back-ref)true-regex 表示,只有当 back-ref 存在时,才会匹配 true-regex;
  ?(back-ref)true-regex|false-regex 表示,若 back-ref 存在,匹配 true-regex; 若不存在,匹配 false-regex.
  文本: (123)456-7890 123-456-7890  (123)-456-7890 123456-7890  (123-456-7890
  正则式: \(?\d{3}\)?-?\d{3}-\d{4}  (\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
  四、小结
  以上所述就是构造正则表达式的基本知识。编写正则表达式的一个技巧是分而治之,先划分成若干子表达式分别调试成功,再组合起来。要掌握这样一个强大的文本工具,惟有勤加练习,勤于思考求精耳。
分享到:
评论

相关推荐

    正则表达式的基础知识!

    正则表达式基础知识!!! 我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配...

    正则表达式 基础知识 一张纸

    将正则表达式的基础知识浓缩到一张纸上,超实用~

    C#正则表达式基础知识

    C#正则表达式基础知识(经典归纳简单易懂

    javascript正则表达式基础知识入门.docx

    javascript正则表达式基础知识入门.docx

    正则表达式的基础知识

    正则表达式基础知识,对于初学者不错的指导。

    正则表达式基础知识与常用类型

    正则表达式基础知识, 1.1 句点符号 1.2 方括号符号 1.3 “或”符号 1.4 表示匹配次数的符号 二、Jakarta-ORO库 。。。。。。。。。。。。。

    vba正则表达式基础

    vba正则表达式基础知识介绍,由浅入深,实例讲解

    ASP.NET 中的正则表达式

    本文介绍了深入学习正则表达式的基础知识和推荐内容。 本文主要面向对正则表达式知之甚少或没有使用经验,但却熟悉 ASP.NET、可借助 .NET 编程的初学者。此外,希望本文连同 regular expression cheat sheet 成为有...

    PHP正则表达式基础知识

    学习正则表达式,菜鸟必看。如果你想学习正则,请进来看看吧!

    正则表达式支持库2.0#0版(静态版)

    注意,本支持库中的所有命令均为高级命令,要求使用者具有一定的正则表达式知识基础。易语言RegEx_static.lib支持库为易语言静态支持库,需要易语言系统5.0版本的支持,需要易语言系统核心支持库5.0版本的支持,提供...

    js正则表达式详解

    包含js正则表达式基础知识、Jakarta-ORO库和一些HTML应用实例

    正则表达式完整高清版

    全书分为三大部分:第一部分主要讲解正则表达式的基础知识,涵盖了常见正则表达式中的各种功能和结构;第二部分主要讲解关于正则表达式的更深入的知识,详细探讨了编码问题、匹配原理、解题思路;第三部分将之前介绍...

    正则表达式支持库2.0#0版

    注意,本支持库中的所有命令均为高级命令,要求使用者具有一定的正则表达式知识基础。易语言RegEx.fnr,RegEx.fne支持库为一般支持库,需要易语言系统3.8版本的支持,需要易语言系统核心支持库3.7版本的支持,提供了2...

    正则表达式_正则表达式_源码

    正则表达式基础知识梳理以及归纳,欢迎下载

    Python 正则表达式入门(初级篇)

    首先说 正则表达式是什么? 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式...

    详细的C#正则表达式基础教程

    C# 正则表达式的用法,包含c#中正则表达式的基本知识和实例运用

    正则表达式支持库1.2版

    正则表达式支持库1.2版 该支持库实现了对正则表达式(Regular Expression)的支持。注意,本支持库中的所有命令均为高级命令,要求使用者具有一定的正则表达式知识基础。 操作系统支持: Windows、Linux、Unix

Global site tag (gtag.js) - Google Analytics