正则表达式(Regex)
正则表达式(Regex, Regular Expression)是一种文本模式,使用单个字符串来描述匹配某个句法规则的字符串集合。
许多编程语言都支持利用正则表达式进行字符串匹配。许多工具软件也提供了基于正则表达式的字符串匹配能力。在软件开发方面,正则表达式的一种常见使用场景是使用正则表达式进行入参的合法校验。
起源
1951 年, 一位叫 Stephen Cole Kleene 的数学家在 McCulloch-Pitts神经网络模型基础上,发表了一篇标题为"神经网络和有限自动机中事件表示法"(Representation of Events in Nerve Nets and Finite Automata)的论文,引入了正则表达式的概念。
1968 年,Unix 之父 Ken Thompson 发表了 《正则表达式搜索算法》(Regular Expression Search Algorithm’)论文,并根据论文的算法,将正则引入到编辑器 qed ,以及之后的编辑器 ed,然后我们熟悉的文本搜索工具 grep 中。从那时起直至现在,正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
1988 年,Larry Wall 发布了 Perl 编程语言。正则表达式功能第一次在编程语言中使用。现代编程语言如Python,Ruby,PHP,C/C++,Java等也提供了对正则表达式的支持。
语法
正则表达式是由普通字符和特殊字符(元字符)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
元字符
元字符只有有限个。元字符根据其作用又可细分为转义符、限定符、定位符、选择符等。接下来将一一介绍。
转义符
转义字符使用反斜线表示,用来标记特殊字符。其作用如下:
字符 | 作用 |
---|---|
\ | 基本定义是将下一个字符标记为特殊字符。注意,正则表达式对其使用扩展,转移字符的下一个字符也能表示特定语义。如\w表示匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
限定符
限定符用来指定必须要出现多少次才能满足匹配。一种由六种基本形式: {n} 、 {n,} 、 {n,m}、* 、 + 、 ? 。其作用如下:
字符 | 作用 |
---|---|
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。 |
{n,m} | n 和 m 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。请注意在逗号和两个数之间不能有空格。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,} |
+ | 匹配前面的子表达式一次或多次。例如,zo* 能匹配 “zo” 以及 “zoo”。+ 等价于{1,} |
? | 匹配前面的子表达式零次或一次。例如,zo? 能匹配 “z” 、 “zo”。? 等价于 {0,1} |
定位符
定位符用来描述字符串或单词的边界。其中,^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。具体描述如下:
字符 | 作用 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
这里比较难理解的就是\b和\B。\B是\b的反义,这里重点说明下\b。假设有一段话:“Hello World”,则对于正则表达式"\b/g"将匹配到“H、o、W、d”四个字符。更多示例可参考链接
圆括号
正则表达式引入圆括号实现分组功能。针对不同的应用场景,可以选择相应的模式。具体模式说明如下:
字符 | 作用 |
---|---|
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到。 |
(?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 |
(?=pattern) | 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)“能匹配"Windows2000"中的"Windows”,但不能匹配"Windows3.1"中的"Windows”。这里的正向是指向右查找。 |
(?!pattern) | 正向否定预查(look ahead negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。与(?=pattern)一样,(?!pattern)也是一个非获取匹配。例如"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。 |
(?<=pattern) | 反向肯定预查(look behind positive assert),与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。 |
(?<!pattern) | 反向否定预查(look behind negative assert),反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。 |
方括号
正则表达式引入方括号实现多匹配功能。针对不同的应用场景,可以选择相应的模式。具体模式说明如下:
字符 | 作用 |
---|---|
[xyz] | 匹配字符集合。匹配所包含的元素中任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[^xyz] | 非匹配字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、‘l’、‘i’、‘n’。 |
[a-z] | 匹配字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。 |
[^a-z] | 非匹配字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。 |
修饰符
修饰符也称为标记,正则表达式的修饰符用于指定额外的匹配策略。修饰符不写在正则表达式里,修饰符位于表达式之外,格式如下:
/pattern/flags
常用的修饰符的含义如下:
修饰符 | 作用 |
---|---|
i | i表示ignore。将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 |
g | g表示global。将匹配设置为全局匹配,查找所有的匹配项。 |
示例
这里给出java使用示例。
// 使用正则相关类库
public boolean isFind(String patternStr, String str) {Pattern pattern = Pattern.compile(patternStr);Matcher matcher = pattern.matcher(str);return matcher.find();
}
参考
https://www.runoob.com/regexp/regexp-tutorial.html 正则表达式 - 教程
https://www.rand.org/content/dam/rand/pubs/research_memoranda/2008/RM704.pdf Representation of Events in Nerve Nets and Finite Automata
https://cloud.tencent.com/developer/article/1914673 梳理正则表达式发展史
https://swtch.com/~rsc/talks/regexp.pdf Implementing Regular Expressions
https://perldoc.perl.org/perlhist perl 语言历史
https://regexper.com/ 正则表达式可视化
https://c.runoob.com/front-end/854/ 正则表达式在线测试
https://www.zhihu.com/question/48219401 如何学会正则表达式
https://github.com/ziishaned/learn-regex 学习正则
https://segmentfault.com/a/1190000013084624 正则表达式中[\b]和\b和\B的区别及匹配分析思路
https://zhuanlan.zhihu.com/p/27355118 正则表达式括号的作用
正则表达式(Regex)相关推荐
- python正则表达regex_Python 正则表达式(RegEx)
版权所有,未经许可,禁止转载 正则表达式是组成搜索模式的字符序列. 正则表达式用于按指定的搜索模式搜索字符串. 正则表达式(RegEx)模块 Python有一个名为re的内置包,用来处理正则表达式. ...
- c++ regex 替换汉字_C++ - 正则表达式(regex) 替换(replace) 的 详解 及 代码
正则表达式(regex) 替换(replace) 的 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/1732163 ...
- Java中的正则表达式 regex
常用类解析:正则表达式 regex 前言 一.正则表达式 二.匹配规则 三.匹配任意字符 四.匹配数字 五.匹配常用字符 六.匹配空格字符 七.匹配非数字 八.重复匹配 九.正则表达式小总结 十.匹配 ...
- c#中regex的命名空间_C#_详解C#正则表达式Regex常用匹配,使用Regex类需要引用命名空间 - phpStudy...
详解C#正则表达式Regex常用匹配 使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 一.利用Regex类实现验证 示例1:注释的代码所起 ...
- C# 正则表达式 Regex类的使用
1.检验数字的表达式 //数字Regex reg = new Regex(@"^[0-9]*$");//n位的数字Regex reg = new Regex(@"^\d{ ...
- Python零基础速成班-第13讲-Python正则表达式Regex
Python零基础速成班-第13讲-Python正则表达式Regex 学习目标 正则表达式 课后作业(4必做) 友情提示:将下文中代码拷贝到JupyterNotebook中直接执行即可,部分代码需要连 ...
- python正则表达式——regex模块
目录 1. 为了与re模块兼容,此模块具有2个行为 2. Unicode中不区分大小写的匹配:Case-insensitive matches 3. Flags 4. 组 5. 其他功能,如下表 参考 ...
- (四)boost库之正则表达式regex
正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std::string str("ab ...
- C语言正则表达式regex
From: http://hi.baidu.com/david_jlu/blog/item/87ada1dbb9af6a60d0164eda.html 正则表达式在linux下应用非常广泛,经常使用s ...
- Boost学习之正则表达式--regex
来源:http://blog.chinaunix.net/uid-21222282-id-1829265.html 来源:http://www.cnblogs.com/undermoon/archiv ...
最新文章
- 一款可视化的在线制作H5
- Java经典编程题50道之三十四
- 前端学习(1943)vue之电商管理系统电商系统之通过路由加载商品分类
- 就算是蜗牛,也有爬到树顶的那一天!~
- lisp文字上标源码_删除重叠文字源码 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - 源码,程序 - Powered by Discuz!...
- cocos2d的单例
- 随笔:《向死而生》---我修的死亡学分
- python 求解给定字符串中的最长DNA序列长度
- asp.net post任何数据类型流到网站--当当网API传XML文件
- **inline**与**volatile**关键字
- qq音乐linux版本下载地址,QQ音乐linux下载
- 微信小程序 背景图片设置
- 十折交叉验证python_Python机器学习:6.2 K折交叉验证评估模型性能
- 从历史上的错误数据中吸取教训
- python 报错“xxx is not defined”
- JVM -- JVM内存结构:程序计数器、虚拟机栈、本地方法栈、堆、方法区(二)
- python ndarray 与 base64 互转 接口传递ndarry
- pycharm python interpreter是空的
- html如何注释文字,css怎么注释?
- 运维企业实战——RHCS集群套件 实现高可用
热门文章
- 容器技术Docker K8s 47 服务网格(ASM)-阿里云服务网络概述
- docker常用操作和命令
- python appium 并行多设备_appium 多个设备同时执行
- JAVA中方法和变量在继承中的覆盖和隐藏
- Gibbs Sampling\吉布斯采样(二)
- 【ML小结7】贝叶斯分类器:朴素、半朴素贝叶斯
- android studio for android learning (二十五 )activity的启动模式详解与标志位简析
- 编译原理完整学习笔记(六):语义分析和中间代码生成
- 【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) E】Cops And Roobers【最小割】
- 括号里面一个上面一个数下面一个数符号怎么打?/ 概率论组合符号怎么打?