浅谈正则表达式-PHP为例

第一次比较系统的学习正则表达式,本篇文章以PHP语言为例来学习。

基本概念

  正则表达式=普通字符(如a-z)+分隔符(正斜线(/)、hash符号(#) 以及取反符号(~))+特殊字符(称为元字符) 两者的组合;

匹配原理

  简单描述下,通常是由字符串位置0开始尝试匹配,若匹配成功存储这个子串;若在某一个位置匹配失败则后移一个位置,从位置1开始重新匹配。直到匹配成功或者匹配到最后一个位置都没有找到成功的子串。

匹配模式

  看名字,是不是想到了设计模式中的单例模式了呢?

  1. 贪婪模式

    在可匹配与可不匹配的时候,优先匹配,比如量词用*或+

  2. 懒惰模式

    在可匹配与可不匹配的时候,优先不匹配,比如量词用?

用途

  1. 查找:检查一个串是否包含某个子串,而子串是符合正则表达式条件的子串,最后得到所有符合条件的子串集合
  2. 替换:将上一条查找出来的子串替换成特定的字符串

正则分隔符

字符 说明 备注
/表达式/ 一个完整的正则表达式的边界  若表达式内有/,需要用转义字符\转义    $p="/ab\//"
#表达式# 一个完整的正则表达式的边界2  若表达式内有#,需要用转义字符\转义    $p="#ab/\##"
~表达式~ 一个完整的正则表达式的边界3  若表达式内有~,需要用转义字符\转义    $p="~ab/#\~~"
|表达式| 一个完整的正则表达式的边界4 若表达式内有|,需要用转义字符\转义    $p="|ab/#\~\||"

元字符

边界定位符

字符 说明 备注
^开头, $结尾 断言。表示这个子串必须完全匹配目标字符串。^匹配字符串开头第一个字母前的位置,$匹配字符串结尾字母的后一个位置 见代码示例1
\b 匹配一个单词边界,匹配单词和空格之间的位置  
\B 匹配一个非单词边界,匹配单词和空格之间的位置  

量词元字符

字符 说明(都是返回能得到的最长子串) 备注
* 0次或多次匹配前面的子表达式, 等价于{0,}
0次或1次匹配前面的子表达式 等价于{0,1}懒惰模式就用这个
+ 1次或多次匹配前面的子表达式 等价于{1,}
{n} n次匹配前面的子表达式  
{n,} 大于等于n次匹配前面的子表达式  
{,n} 小于等于n次匹配前面的自表达式  
{n,m} 最少n次,最大m次,匹配前面的自表达式  

普通元字符

字符 说明 备注
 \d  数字,等价于[0-9]  
 \D  非数字,等价于[^0-9]  
 \w  匹配字母、数字、下划线,等价于[a-zA-z0-9_]  
\W  匹配非[^a-zA-z0-9_]  
\s  匹配任何空白字符(包括空格、制表符、换页符),等价于[\n\f\t\r\v]  
\S  匹配任何非空白字符(包括空格、制表符、换页符),等价于[^\n\f\t\r\v]  
\ 转义字符  
. 匹配除换行符(\n)之外的任何字符  
[]
包含能得到一个字符的表达式,自带“或”的属性,后面可以跟修饰符。

方括号内,个别字符有不同的含义:

  ^仅在作为第一个字符(方括号内)时,表明字符类取反

  - 标记字符范围

  \ 转义字符

 
() 包含一个子表达式,要表达“或”需要“|”  
| 开始一个可选分支  

分组元字符

字符 说明 备注
() 将表达式括起来,与其他元字符配合使用  

引用

字符 说明 备注
& 在替换字符串中,符号&代表整个正则表达式所匹配的字符串的内容  仅在替换时使用
\n(n=1,2...) 转移数字\n代表索索字符串的第n个括号中正则表达式所匹配的字符串内容  查找、替换都能使用

各元字符的优先级

优先级 字符集 说明
1 \ 转义
2 ^\w\d等  
3 (),[]  
4 *,+,?,{} 两次
5 ^,$ 断言,位置
6 | 分组

PHP中正则相关的几个方法

1.preg_match($pattern, $subject, $matches);

用途:返回值是匹配成功的次数0或者1,在匹配到1次以后就会停止搜索

参数:$pattern 为正则表达式;$subject为被搜索的字符串;$matches可选,存储匹配结果的数组,$matches[0]包含整个模式匹配的文本,$matches[1]为第一个括号中的子模式所匹配的文本,依次类推

代码示例:

$subject = "abcdef";
$pattern = ‘/a(.*)(\w)d/‘;
preg_match($pattern, $subject, $matches);
print_r($matches);

 返回结果:

  Array
  (
    [0] => abcd
    [1] => b
    [2] => c
  )  

2.preg_match_all($pattern, $subject, $matches[,int flags]);

 用途:循环获取一个列表的匹配结果数组。

 参数:$pattern 为正则表达式;$subject为被搜索的字符串;

    $matches可选,存储匹配结果的多维数组,flags有多个值。http://www.360doc.com/content/12/0828/13/10503611_232787142.shtml

    case: flag=1,PREG_PARTTERN_ORDER   默认值,$matches[0]存储的是全部模式匹配的数组,$matches[1]为第一个括号中的子模式所匹配的文本array,依次类推。

    case: flag=2,PREG_SET_ORDER ,$matches[0]存储的是第一括号里面模式匹配的所有数组,$matches[1]为第而括号里面模式匹配的所有数组,依次类推

    case: flag=3,PREG_OFFSET_CAPTURE,m

    $matches[0]包含整个模式匹配的文本array,$matches[1]为第一个括号中的子模式所匹配的文本array,依次类推。

常用示例

$mail="/[\w|.][email protected]\w+.\w{3}/";匹配邮箱,@前面可以是.或者字母、数字、下划线,@后面是字母、数字、下划加.再加字母、数字、下划

时间: 2024-10-06 20:34:17

浅谈正则表达式-PHP为例的相关文章

浅谈正则表达式中的分组和引用

问题 我的答案 说明 由正则表达式如何匹配相同字符出发,讲讲正则表达式中的选择.分组和引用. 问题 在外刊君读者群中看到有人提出这样的一个需求: 把字符串切成连续相同字符的正则怎么写?比如abbcccdddd切成a,bb,ccc,dddd 之前我对正则表达式也是略有研究,想尝试一下.其实我对正则表达式的学习基本完全来源于犀牛书的第10章,真正看懂这一章,我觉得操作正则表达式应该不在话下. 我的答案 先给出我的答案吧: 'abbccddd'.match(/(w)1*/g) // ["a"

浅谈正则表达式

释义: 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规则)的文本. 概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 给定一个正则表达式和另一个字符串,我们可以达到如下的目的: 1. 给定的字符串

菜鸟之路-浅谈设计模式之单例设计模式

单例设计模式 定义:确保一个类仅仅有一个实例.并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问,从而方便对实例个数的控制并节约系统资源.假设希望在系统中某个类的对象仅仅能存在一个,单例模式是最好的解决方式. 关于单例设计模式的动机 对于系统中的某些类来说,仅仅有一个实例非常重要,比如.一个系统中能够存在多个打印任务.可是仅仅能有一个正在工作的任务:

浅谈 正则表达式

1.正则表达式到底是什么东西? 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?.如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc.在这里,*会被解释成任意的字符串.和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是

浅谈正则表达式一

''' 正则表达式作用:判断一个字符串是否匹配给定的格式:例如判断用户注册账号是否满足格式,抓取页面链接等. ''' import re #使用正则表达式需要导入re模块 st = "[email protected]" st1 = re.findall(r'^[a-zA-Z0-9][email protected][a-zA-Z0-9]+\.com$',st) #前面为匹配的规则,后面为原始字符串 print(st1) #findall方法:在字符串中找到正则表达式所匹配的所有字符串

浅谈单例的三种实现--C#

传统的double check : public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (i

Linux的文本处理工具浅谈-awk sed grep

Linux的文本处理工具浅谈 awk   老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS竖着切,列的分隔符 RS横着切,行的分隔符 [语法格式] awk [–F] [“[分隔符]”] [’{print$1,$NF}’] [目标文件] awk 'BEGIN{FS="[列分隔符]+";RS="[行分隔符]+";print "-GEGIN-"

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制