PHP正则表达式学习笔记1

本文介绍了PHP中正则表达式的使用方法,包括选择合适的函数库、基本的语法规则及修正符等内容。
PHP正则表达式学习笔记1
(《细说PHP》12章笔记1)

1 正则表达式简介
正则表达式也称为模式表达式,自身具有一套非常完整的,可以编写模式的语法体系,提供一种灵活且直观的字符串处理方法。
正则表达式通过构建具有特定规则的模式,与输入的字符串信息比较,在特定的函数中使用从而实现字符串的匹配。

1.1 选择PHP正则表达式的处理函数库
在PHP中支持两套正则表达式的处理函数库,一套是由PCRE(Prel Compatible Regular Expression)来提供的,与Perl语言兼容的正则表达式函数。
使用以"preg_"为前缀命名的函数,而且表达式都应被包含在定界符中,如斜线。
另一套是由POSIX(Portable Operation System interface)扩展语法的正则表达式函数,使用以"ereg_"为前缀命名的函数。
两套函数库的功能相似,执行效率稍有不同。
一般而言,实现相同功能,使用第一种PCRE库提供的正则表达式效率略占优势。

2 正则表达式的语法规则
正则表达式作为一个匹配的查板,是由原子(普通字符,例如字符a到z),有特殊功能的字符(称为元字符,例如*,+和?等),以及模式修正符三部分组成的文字模式。

2.1定界符
通常都需要将模式表达式放入定界符之间。作为定界的字符也不仅仅局限于使用斜线"/"。除了字母,数字和反斜线"\"以外的字符都以作为定界符号,例如"#","!","{}"和"|"

2.2原子
原子是正则表达式的最基本组成单位(???吐槽:我初中物理老师可是说原子是分子的组成单位啊)
每个模式中最少要包含一个原子

1 普通字符作为原子
所有的大小写字母,所有数字
/5/    --匹配字符串中是否有5这个字符出现
/php/    --匹配字符串中是否有php字符串出现

2一些特殊字符和元字符作为原子
如果一些特殊符号在正则表达式中有一些特殊意义,必须使用转义字符"\"取消它的特殊意义,将其变成一个普通的原子
所有标点符号以及一些其他符号,双引号“"”,“'”,“+”,“.”等等,\" \' \+ \.
例: /\<br\/\>/

3一些非打印字符作为原子
\cx        匹配由x指明的控制字符,例如:\cM匹配一个Control-M或回车符,x的值必须为A~Z或a~z之一,否则,将c视为一个原义的'c'字符
\f         匹配一个换页符,等价于\x0c和\cL
\n         匹配一个换行符,等价于\x0a和\cJ
\r         匹配一个回车符,等价于\x0d和\cM
\t         匹配一个制表符,等价于\x09和\cI
\v        匹配一个垂直制表符,等价于\x0b和\cK
例:
'/\n/''    --在Windows系统中用于匹配字符串中是否有回车换行出现。
'/\r\n/'    --在Linux系统中用于匹配字符串中是否有回车换行出现。

4使用"通用字符类型"作为原子
\d         匹配任意一个十进制数字,等价于[0-9]
\D         匹配任意一个非十进制数字以外的字符,等价于[^1-9]
\s         匹配任意一个空白字符,等价于[\f\n\r\t\v]
\S         匹配除空白字符以外的任何一个字符,等价于[^\f\n\r\t\v]
\w         匹配任意一个数字,字母或下画线,等价于[0-9a-zA-Z_]
\W         匹配除数字,字母或下画线以处的任意一个字符,等价于[^0-9a-zA-Z_]

5自定义原子表[]作为原子
使用[]可以定义一组彼此地位平等的原子
'/[apj]sp/'' 匹配asp,psp,或jsp
'/[^apj]sp/' 匹配除asp,psp或jsp外的其它sp
'/0[xX][0-9a-fA-F]+/' 匹配一个十六进制

2.3元字符
元字符就是用于构建正则表达式的具有特殊含义的字符,例如"*","+"之类。
在一个正则表达式中,元字符不能单独出现,它必须是用来修饰原子的。
如果要在正则表达式中包含元字符本身,使其失去特殊含义,则必须在前面加上"\"进行转义

*        匹配0次,1次或多次其前的原子
+        匹配1次或多次其前的原子
?         匹配0次或1次其前的原子
.        匹配除换行符外的任意一个字符
|        匹配两个或多个分支选择
{n}        表示其前面的原子恰好出现n次
{n,}    表示其前面的原子出现不少于n次
{n,m}    表示其前面的原子到少出现n次,最多出现m次
^或\A     匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一换行符之后)
$或\Z     匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一换行符之前)
\b         匹配单词的边界
\B         匹配单词边界以外的部分
[]         匹配方括号指定的任意一个原子
[^]     匹配除方括号中的原子以外的任意一个字符
()         匹配其整体为一个原子,即模式单元,可以理解为由多个单个原子组成的大原子

1限定符
限定符来指定正则表达式的一个给定原子必须出现多少次才能满足匹配
有* + ? {n} {n,} {n,m} 6种

2边界限制
有来限定字符串或单词的边界范围,以获得更准确的匹配结束
^ $分别指字符串的开结与结束
\b 用于描述字符串中每个单词的前或后边单
\B 表示非单词边界
字符串 this is a test
'/^this/' --匹配此字符串是否是以字符串"this"开始的,匹配成功
'/test$/' --匹配此字符串是否是以字符串"test"结束的,匹配成功
'/\bis\b/' --匹配字符串中是否含有单词"is",因为字符串"is"两边都需要有边界
'/\Bis\b/' --查找字符串"is"时,左边不能为边界而右边必须有边界,如"this"匹配成功

3句号(.)
在字符类之外,模式中的圆点可以匹配目标中的任何一个字符,包括不可打印字符。
但不匹配换行符(默认情况下),相当于"[^\n]"(Unix系统)或"[^\r\n]"(Windows系统)。
处理.与^和$是完全独立的,唯一的联系就是它们都涉及换行符
'/a.b/'    --匹配在a和b之间任意一个字符的字符串

4模式选择符(|)
竖线字符"|"用来分隔多选一模式
例:
"LAMP|J2EE"表示可匹配LAMP或J2EE,因为元字符竖线"|"的优先级是最低的

5模式单元
模式单元是使用元字符"()"将多个原子组成大的原子,被当成一个单元独立使用。与数学表达式中的括号作用类似,一个模式中的表达式将被优先匹配
例:
'/(very)* good/'    --可匹配 good,very good,very very good,very very …… good

6后向引用
一个正则表达式模式或部分模式两边添加圆括号装将导致相关匹配存储到一个临时缓冲区中,可以被获取供以后使用,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储,存储子匹配的缓冲区编号从1开始,连续编号直至最大99个子表达式,用\n型式引用,在正则表达式中成\\n
例:
'/^\d{4}\W\d{2}\W\d{2}$/'    --  2000-01/01能匹配
'/^\d{4}(\W)\d{2}\\1\d{2}$/'    --    2000-01-01
当需要使用模式单元而又不想存储匹配结果时,可以使用非捕获元字符"?:","?=","?!"来忽略相关匹配的保存。
'/(Windows)(Linux)\\2OS/'
'/(?:Windows)(Linux)\\1OS/'

7模式匹配的优先级
相同优先级从左向右,不同从上到下
\    转义字符
()    (?:)    (?=)    []     模式单元和原子表
*    +    ?    (n)        (n,)    (n,m)    重复匹配
^    $    \b     \B     \A     \Z     边界限制
|     模式选择

2.4模式修正符
模式修正符在正则表达式定界符之外使用(最后一个斜线"/"之后)
模式修正符可以调整正则表达式的解释,扩展了正则表达式的在匹配,替换等操作时某些功能,而且模式修正符也可以组合使用,更增强了正则表达式的处理能力。
i     在和模式进行匹配时不区分大小写
m     将字符串视为多行,默认的正则开始"^"和结束"$"将目标字符串作为单一的"行"字符
s     模式中的画点元字符"."匹配所有的字符,包括换行符。
x     模式中的空白忽略不计,除非它已经被转义
e     只用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串
U     本修正符反转了匹配数量的值使其不是默认的重复,而变成后面跟上"?"才变得重复。
D     模式中的美元元字符仅匹配目标字符串的结尾。没有此项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问题中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系与实际应用场景,强调“借力”工具与创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课题的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计与实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现与创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理与代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试与复现,同时注重从已有案例中提炼可迁移的科研方法与创新路径。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文提出了一种基于非支配排序的蜣螂优化算法(NSDBO),用于求解微电网多目标优化调度问题。该方法结合非支配排序机制,提升了传统蜣螂优化算法在处理多目标问题时的收敛性分布性,有效解决了微电网调度中经济成本、碳排放、能源利用率等多个相互冲突目标的优化难题。研究构建了包含风、光、储能等多种分布式能源的微电网模型,并通过Matlab代码实现算法仿真,验证了NSDBO在寻找帕累托最优解集方面的优越性能,相较于其他多目标优化算法表现出更强的搜索能力稳定性。; 适合人群:具备一定电力系统或优化算法基础,从事新能源、微电网、智能优化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网能量管理系统的多目标优化调度设计;②作为新型智能优化算法的研究与改进基础,用于解决复杂的多目标工程优化问题;③帮助理解非支配排序机制在进化算法中的集成方法及其在实际系统中的仿真实现。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注非支配排序、拥挤度计算蜣螂行为模拟的结合方式,并可通过替换目标函数或系统参数进行扩展实验,以掌握算法的适应性与调参技巧。
本项目是一个以经典51系列单片机——STC89C52为核心,设计实现的一款高性价比数字频率计。它集成了信号输入处理、频率测量及直观显示的功能,专为电子爱好者、学生及工程师设计,旨在提供一种简单高效的频率测量解决方案。 系统组成 核心控制器:STC89C52单片机,负责整体的运算控制。 信号输入:兼容多种波形(如正弦波、三角波、方波)的输入接口。 整形电路:采用74HC14施密特触发器,确保输入信号的稳定性精确性。 分频电路:利用74HC390双十进制计数器/分频器,帮助进行频率的准确测量。 显示模块:LCD1602液晶显示屏,清晰展示当前测量的频率值(单位:Hz)。 电源:支持标准电源输入,保证系统的稳定运行。 功能特点 宽频率测量范围:1Hz至12MHz,覆盖了从低频到高频的广泛需求。 高灵敏度:能够识别并测量幅度小至1Vpp的信号,适合各类微弱信号的频率测试。 直观显示:通过LCD1602液晶屏实时显示频率值,最多显示8位数字,便于读取。 扩展性设计:基础版本提供了丰富的可能性,用户可根据需要添加更多功能,如数据记录、报警提示等。 资源包含 原理图:详细的电路连接示意图,帮助快速理解系统架构。 PCB设计文件:用于制作电路板。 单片机程序源码:用C语言编写,适用于Keil等开发环境。 使用说明:指导如何搭建系统,以及基本的操作方法。 设计报告:分析设计思路,性能评估技术细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值