网站首页 > 技术文章 正文
正则表达式用处挺广的,主要用于处理字符串。
正则引擎
想要在计算机语言中使用正则表达式,那么这门计算机语言必须要利用正则引擎去实现相应的正则库。主要的正则引擎分为以下两类:
- DFA 确定性的状态机。不使用”回溯”,效率高,但是支持的正则表达式语法有限。
- NFA 非确定性状态机。构造简单,使用”回溯算法”,支持大多数的正则语法,是目前使用最广泛的正则引擎,大多数计算机语言例如Java、PHP、Ruby、Python等都是使用的NFA正则引擎。
语言实现
不同的语言对正则的实现不同,暴露出来的方法也不同,但方法的作用其实都是大同小异,这里用PHP语言做例子。
匹配字符串
- preg_match(string $pattern, string $subject[, array &$matches]) 使用很频繁。函数返回匹配到的结果的次数。只匹配一次,参数matches只返回第一条结果。
- preg_match_all(string $pattern, string $subject[, array &$matches]) 使用很频繁。函数返回匹配到的结果的次数。参数matches只返回所有结果。
替换字符串或数组
- preg_replace($pattern, $replacement, $subject) 返回匹配过滤后的字符串或者数组。
- preg_filter($pattern, $replacement, $subject)返回匹配过滤后的字符串或者数组。
这俩函数,都可以替换字符串,在字符串替换中,俩函数用法完全一致。
这俩函数,不仅可以替换字符串,还可以替换数组!在替换数组的时候,pre_filter会过滤掉没有匹配到的内容,而pre_replace不会,这就是他俩的唯一区别。
替换数组
- preg_grep(string $pattern, array $input[, int flags = 0]) 返回匹配模式的数组条目。阉割版本的preg_filter
正则运算符转义
对一个字符串中的正则表达式的运算符:”. \ + * ? [ ] ^ $ ( ) { } = ! < > | : -“进行转义,转义成非正则表达式的运算符,否则正则表达式会认为其为运算符。
- preg_quote(string $str[, string $delimiter = null ]) 转义正则表达式字符串。返回转义后的字符串。
正则表达式语法
你可以把正则表达式当做一门简单的语言来看,但是它的语法显然比一般的计算机语言要简单一些。
界定符
指定正则表达式的开始和结束,可以当成是计算机语言中的大括号{和}。一般有三种表现方式:
- 斜杠。例如/[0-9]/。这是最常用的方式,在PHP中,推荐使用这种方式。
- 井号。例如#[0-9]。
- 大括号。例如{[0-9]}。在正则表达式中,大括号还有其他作用,所以这种方式不推荐使用。
原子
正则表达式中最小的匹配单位,其实就是字符串中的字符。主要分为两大类:
可见原子:
肉眼能够看见的字符。
- 标点符号。例如:”_ ? . ;,“等等
- 英文字母数字。例如:”a-z,A-Z,0-9“
- 汉字、日文、阿拉伯文等其他语言文字
- 数理化公式符号。例如:”∩ ∪ π Ω “等等
- 其他可见字符
由于某些字符在正则表达式中属于特殊字符,那么在书写这类特殊字符的时候,应该注意要加上反斜杠\,例如如果匹配^直接写/^/肯定不行,如果加上反斜杠,就可以了。\^
不可见原子:
肉眼看不到的。
- 空格。
- 换行符\n
- 回车符\r
- 制表符\t。其实就是按一下键盘tab键出来的
- 其他不可见字符
元字符
定义原子的筛选方式,队员原子进行归类,简化正则表达式的书写。
- | 匹配两个或者多个分支选择。 和计算机语言中的含义是一样的:或者
- [] 匹配方括号中的任意一个原子。
- [^] 配配除方括号之外的任意字符串。
- . 匹配除\n之外的任何单个字符。要匹配包括\n在内的任何字符,请使用象[.\n]的模式。
- \d 十进制数字,等同于[0-9]
- \D 匹配任意一个非十进制的数字,等同于[^0-9]
- \s 匹配任意一个不可见原子。等同于[\f\n\r\t\v]
- \S 匹配一个可见原子。等同于[^\f\n\r\t\v]
- \w 匹配任意数字、字母或下划线。既[0-9a-zA-Z_]
- \W 匹配任意非数字、字母或下划线。即[^0-9a-zA-Z_]
量词
表示某一个原子连续出现的数量。
- {n} 表示前面的原子恰好出现n次
- {n,} 表示前面的原子最少出现n次
- {n,m} 表示前面的原子最少出现n此,最多出现m次
- * 匹配0次、1次、或者多次。等同于{0,}
- + 一次或者多次。等同于{1,}
- ? 0次数或者1次。等同于{0,1}
边界控制
- ^ 匹配字符串开始的位置。即”必须以……为开头”
- $ 匹配字符串结束的位置。即”必须以……为结尾”
模式单元
将模式单元中的括号及其正则表达式当做是一个原子来看待。
- () 匹配其中的整体为一个原子。
修正模式
给正则表达式的匹配过程添加一种匹配模式
- U 加U是懒惰匹配,不加U是默认的贪婪匹配。
- i 忽略英文字母大小写。
- x 忽略空白。(包括空格和按tab键输出的制表符)
- s 让元字符.匹配包括换行符在内的所有字符。
- e preg_replace()在替换字符串中对逆向引用作正常的替换。简单的说,就是PHP会把replace的结果当做PHP代码。(替换字符串要符合php的语法规范)
- 例如:echo preg_replace('/(\d+),(\d+)/e', '$1+$2', '2,3');会输出5。
书写方式为:
$pattern = '/hello World/U'
$pattern = '/hello World/i'
$pattern = '/hello World/Ui'//可以任意组合
猜你喜欢
- 2024-10-10 惊爆!一行正则表达式引发的 CPU 惨案
- 2024-10-10 一类PHP RASP实现 php radius
- 2024-10-10 一个正则表达式怎么会引起线上CPU狂飙?
- 2024-10-10 藏在正则表达式里的陷阱 藏在正则表达式里的陷阱是什么
- 2024-10-10 软件工程毕业设计系统附完整文档和项目代码
- 2024-10-10 从一次CPU打满到ReDos攻击和防范 e52666v3相当于什么cpu
- 2024-10-10 正则表达式和 CPU 100%有什么故事?
- 2024-10-10 Java 正则表达式 StackOverflowError 问题及其优化
- 2024-10-10 Java正则表达式详细解析 java里的正则表达式
- 2024-10-10 解密前端面试: 100道必备考题带你get offer
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)