正则表达式简明参考

正则表达式简明参考

2014-09-11

前言

我想在网上最出名的正则相关的一篇文章就是《正则表达式30分钟入门教程》了,说实话这篇文章确实是我的正则入门,但是随着使用熟练,冗长的文章已经不能满足我了,在此做个归纳总结,用于快速查阅。

以下语法在Java中有效,大部分应该是通用的。

元字符

元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。

匹配字符

  • . 匹配除换行符以外的任意字符
  • \w 匹配字母或数字或下划线或汉字
  • \s 匹配任意的空白符
  • \d 匹配数字

匹配位置

  • \b 匹配单词的开始或结束
  • ^ 匹配字符串的开始
  • $ 匹配字符串的结束
  • \G 上一个匹配的结尾(本次匹配开始)
  • \A 字符串开头(类似^,但不受处理多行选项的影响)
  • \Z 字符串结尾或行尾(不受处理多行选项的影响)
  • \z 字符串结尾(类似$,但不受处理多行选项的影响)

重复

  • * 重复零次或更多次
  • + 重复一次或更多次
  • ? 重复零次或一次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次

字符转义

如果想匹配元字符本身或者正则中的一些特殊字符,使用\转义。例如匹配*这个字符则使用\*,匹配\这个字符,使用\\

需要转义的字符:$()*+.[]?\^{}|

字符类

当需要匹配明确的字符或字符集合时候,就用到字符类。

特殊字符

  • \0hh 8进制值hh所表示的字符
  • \xhh 16进制值hh所表示的字符
  • \uhhhh 16进制值hhhh所表示的Unicode字符
  • \t Tab
  • \n 换行符
  • \r 回车符
  • \f 换页符
  • \e Escape
  • \cN ASCII控制字符。比如\cC代表Ctrl+C
  • \p{name} Unicode中命名为name的字符类,例如\p{IsGreek}

陈列

  • [aeiou] 匹配一个元音字符
  • [.?!] 匹配给定的一个标点

范围

  • [0-9] 匹配0~9的数字,同\d
  • [a-z] 匹配所有小写字母
  • [a-zA-Z] 匹配所有字母
  • [a-z0-9A-Z_] 等同于\w

反义

表示不属于元字符或者字符类的字符

反义元字符

  • \W 匹配任意不是字母,数字,下划线,汉字的字符
  • \S 匹配任意不是空白符的字符
  • \D 匹配任意非数字的字符
  • \B 匹配不是单词开头或结束的位置

反义字符类

  • [^x] 匹配除了x以外的任意字符
  • [^aeiou] 匹配除了aeiou这几个字母以外的任意字符

分枝条件

又叫逻辑运算符,在此XY表示两个表达式

  • XY X紧跟Y
  • X|Y 表示X或Y,从左到右,满足第一个条件就不会继续匹配了。

分组

在这里我把表达式统一以\w为例:

  • (\w) 被一个括号包围起来是一个整体,表示一个分组
  • (\w)(\w) 自动命名分组,第一个小括号是分组1,第二个小括号是分组2
  • (?‘Word‘\w+)) 表示定义了一个叫做Word的分组
  • (?<Word>\w+)) 表示定义了一个叫做Word的分组
  • (?:\w+) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

后向引用

后面的表达式可以引用前面的某个分组,用\1表示,就好像分组1的值赋值给了\1这个变量,这个变量可以在后面任意位置引用。

  • \1 表示分组1匹配的文本
  • \k<Word> 表示分组Word匹配的文本

匹配重复两个的英文,例如匹配Hello Hellolei123 lei123

  1. (\w+)\s+\1
  2. (?<Word>\w+)\s+\k<Word>

零宽断言(正向和负向)

零宽断言表示匹配字符的时候再添加一些定位条件,使匹配更精准。

  • \w+(?=ing) 匹配以ing结尾的多个字符(不包括ing)
  • \w+(?!ing) 匹配不是ing结尾的多个字符

  • (?<=re)\w+ 匹配以re开头的多个字符(不包括re)
  • (?<!re)\w+ 匹配不是re开头的多个字符

  • (?<=\s)\d+(?=\s) 匹配两边是空白符的数字,不包括空白符

贪婪与懒惰

贪婪:匹配尽可能长的字符串

懒惰:匹配尽可能短的字符串

懒惰模式的启用只需在重复元字符之后加?既可。

  • *? 重复任意次,但尽可能少重复
  • +? 重复1次或更多次,但尽可能少重复
  • ?? 重复0次或1次,但尽可能少重复
  • {n,m}? 重复n到m次,但尽可能少重复
  • {n,}? 重复n次以上,但尽可能少重复

处理选项

在表达式里插记号的方式来启用绝大多数的模式,在正则的哪里插入,就从哪里启用。

  1. (?i):忽略大小写(CASE_INSENSITIVE)
  2. (?x):忽略空格字符(COMMENTS)
  3. (?s).匹配任意字符,包括换行符(DOTALL)
  4. (?m):多行模式(MULTILINE)
  5. (?u):对Unicode符大小写不敏感(UNICODE_CASE),必须启用CASE_INSENSITIVE
  6. (?d):只有‘\n‘才被认作一行的中止(UNIX_LINES)

平衡组/递归匹配

平衡组用于匹配嵌套层次结构,常用于匹配HTML标签(当HTML内容不规范,起始标签和结束标签数量不同时,匹配出正确配对的标签),在此把表达式统一以\w为例。

  • (?‘group‘\w) 捕获的分组(\w匹配到的内容)命名为group,并压入堆栈
  • (?‘-group‘\w) 捕获分组(\w匹配到的内容)后,弹出group分组栈的栈顶内容(最后压入的捕获内容),堆栈本来为空,则本分组的匹配失败
  • (?(group)yes|no) 如果group栈非空匹配表达式yes,否则匹配表达式no
  • (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

注释

注释语法:(?#comment),这个语法的内容会被正则忽略,用于注释含义。可以放在正则表达式的任意位置。

时间: 2024-11-03 03:41:51

正则表达式简明参考的相关文章

正则表达式学习参考

正则表达式学习参考 1       概述 正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中“高大”.“坚固”等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征. 正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展. 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多,各种

正则表达式简明笔记

正则表达式描述了一种字符串的匹配模式,可以用来检查一个串是否含有某子串,或是特定字符串是否匹配特定规则. 换句话说就是记录文本规则的一段代码.其目的在于精确地过滤字符,找到想要的字符. 历史:正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器 此后便被广泛用在文本搜索和匹配上 结构:正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式 第一小节:元字符  下面是一些常见的元字符 \b  代表单词的开头或结尾,即单词的分界.匹配的是一

正则表达式 学习参考 推荐入门者看

正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中"高大"."坚固"等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征. 正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展. 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多,各种宿主语言提供

正则表达式简明学习(一)

tr:nth-child(odd) > td, .table-striped tbody > tr:nth-child(odd) > th { background-color: #f9f9f9; } .toc li { list-style: none; } p { line-height: 1.8em; } body>p { margin-bottom: 1.8em; } body>p>img.center, body>p>a>img.center

Swift 简明参考

Swift 是苹果推出的一门新语言,它的语法仍然是在 C 语言基础上的延伸,溶入了面向对象语言和脚本语言的特征,还有一点 Objective-C 的影子. 基本类型 Swift 是强数据类型的,也是类型安全的,常量和变量都有着明确的类型.大多数情况下,编译器可根据赋值推导出类型,从而帮助省略代码书写,使得代码比较简洁.Swift 中的类型包括基本类型(Int, Double等),还包括类.结构和枚举.类型在 Swift 中称作 Type. 定义常量与变量使用 let 和 var 关键字.let

免费的编程中文书籍索引

免费的编程中文书籍索引,欢迎投稿. 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版. stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版 github 上的一个流行的编程书籍索引 中文版 感谢 @siberiawolf 使用 Bootstrap 开发了网页版,地址:http://siberiawolf.com/free_programming/index.html 参与交流 欢迎大家将珍藏已久的经典免费书籍共享出来,您可以: 使用 Issues 

免费的编程中文书籍索引【藏】

出处:http://siberiawolf.com/free_programming/index.html 本文所列文章全部来自@justjavac.由于本文更新方式为手动更新,更新时间较慢,所以最新最全最好的文章,请直接访问作者:免费的编程中文书籍索引 语言无关类 操作系统 开源世界旅行手册 鸟哥的Linux私房菜 Linux 系统高级编程 The Linux Command Line (中英文版) Linux 设备驱动 (第三版) 深入分析Linux内核源码 UNIX TOOLBOX Doc

编程中文书籍索引

编程中文书籍索引 免费的编程中文书籍索引 免费的编程中文书籍索引,欢迎投稿. 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版. stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版 github 上的一个流行的编程书籍索引 中文版 感谢 @siberiawolf 使用 Bootstrap 开发了网页版,地址:http://siberiawolf.com/free_programming/index.html 参与交流 欢迎大家将珍藏已久的经典免费书

各类免费资料及书籍索引大全(珍藏版)

本文所列文章全部来自@justjavac.由于本文更新方式为手动更新,更新时间较慢,所以最新最全最好的文章,请直接访问:免费的编程中文书籍索引 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版. stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版 github 上的一个流行的编程书籍索引 中文版 语言无关类 操作系统 开源世界旅行手册 鸟哥的Linux私房菜 Linux 系统高级编程 The Linux Command Line (中英文版) Li