细说正则表达式下篇

2024-06-19 07:18

本文主要是介绍细说正则表达式下篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说明:
细说正则表达式下篇
本文为任鹏原创,每一个例子都是任鹏亲自设计并且通过调试的。本文主要讲解正则表达式的一些特殊用法,并不涉及正则的基础知识,基础知识部分请参考《细说php》一书和老师的课件
由于篇幅关系本文分为上下篇,上篇主要讲解后向引用,模式修正符,以及贪婪模式和非贪婪模式,下篇主要讲解特殊字符的转义,欢迎大家挑错^_^

1.在正则表达式中匹配特殊字符

1.1匹配正则表达式的元字符 ^ $ ( ) [ ] * + ? . |

如果要进行匹配的字符串$string中包含了以上列出的这些字符(这些字符是正则表达式元字符,在正则表达式中有特殊意义),则在正则表达式中要在元字符前面加上转义字符\,表示需要匹配这些字符而不是使用这些字符的特殊意义

例1:
$string = 'fooa^bbar';
$pattern = '/a\^b/'; //我要在$string中查找是否包含字符串 a^b

if(preg_match($pattern,$string,$match)){
echo '找到匹配的字符串 '.$match[0];
}else{
echo '没有匹配的字符串';
}

例2:
$string = 'a*b';
$pattern = '/^[a-z]\*[a-z]$/'; //我要查看字符串$string是否只有三个字符,并且格式为 小写字母星号小写字母

if(preg_match($pattern,$string,$match)){
echo '找到匹配的字符串 '.$match[0];
}else{
echo '没有匹配的字符串';
}

例3:
$string = 'a|b';
$pattern = '/a\|b/';

$string = 'a$b';
$pattern = '/^[a-z]\$[a-z]$/'; //注意 这里的第一个$是需要匹配的字符,因此需要加\进行转义,而第二个$前面没有加\,表示使用$的特殊意义而不是匹配这个字符,$在正则中的特殊意义就是表示字符串的结尾处,所以这个正则表达式表示的是需要查找$string是否包含以小写字母开头,以小写字母符结尾,并且中间包含一个字符$,换句话说就是查看$string是否只有三个字符,格式为 小写字母$小写字母

$string = 'a?b';
$pattern = '/a\?b/';

$string = 'a?b';
$string = 'ab';
$pattern = '/a\??b/'; //注意第一个问号与第二个问号的不同意义,该正则可以匹配上面的两个字符串 a?b 和 ab



if(preg_match($pattern,$string,$match)){
echo '找到匹配的字符串 '.$match[0];
}else{
echo '没有匹配的字符串';
}


1.2 匹配其他特殊字符# @ %等等 这些字符不是正则表达式的元字符,在正则表达式中没有特殊意义,因此不需要转义,当然如果转义也可以

$string = 'a#b';
$pattern = '/a#b/'; 可以在$string中找到 a#b
$pattern = '/a\#b/'; //如果加上转义字符也可以


1.3 混合使用元字符和其他特殊字符

$string = 'a#^$b';
$pattern = '/a#\^\$b/';
$pattern = '/^a#\^\$b$/';


if(preg_match($pattern,$string,$match)){
echo '找到匹配的字符串 '.$match[0];
}else{
echo '没有匹配的字符串';
}

1.4 匹配\字符,这个非常重要

$string = 'a\b';
$string = 'a\\b'; //这两种写法都表示字符串字面量 a\b,但是最好在\前面加上\,因为单引号虽然不解析转义字符,但是单引号里面的单引号和\需要转义,所以这个 $string表示的是包含三个字符的字符串 a\b

$pattern = '/^a\\\\b$/'; //这里一定要用四个反斜线\\\\(或者三个 \\\,后面会说原因),如果你用两个\\那你悲催了,为什么要用四个呢?听我慢慢讲来。

php 中并没有正则表达式类型,php中只有8个类型,int float bool string array object null resource,并没有正则类型(其他语言中有的有正则类型,所以将来在写JS正则的时候会发现虽然都是用的perl风格,但是会有不同)。 php中既然没有正则类型,于是便将正则写在字符串中,所以 $pattern = '/[a]+/'; 一定要加引号!!!!!! (在其他一些语言中不需要加引号是因为那些语言本身有正则类型 $pattern = /[a]+/; /[a]+/本身就是正则类型的,就像整型12 浮点1.23 布尔true一样,不要加引号,加了引号就变成字符串类型了,但是php中的正则一定要加引号)

我们一般将正则加到单引号中 '/^abc$/' 其实也可以加到双引号中,只不过用双引号会有一些麻烦,稍后会说

先说单引号中的转义,我们知道,单引号本身不解析转义字符,但是\和单引号本身除外 ,因此如果在单引号字符串中如果需要用到\和',那么必须要在前面加上一个\作为转义,因此'a\\b'就表示字符串字面量 a\b, 'a\'b' 就表示字符串字面量 a'b。那么 'a\n\t\$b' 这个代表什么呢 因为单引号不解析转义字符,所以这里的\n\t\$会原样输出,所以'a\n\t\$b'代表字符串字面量 a\n\t\$b。那么 'a\\b' 和 'a\b' 是不是代表的相同的字符串字面量呢?答案是是的,'a\\b' 单引号中的两个\\被解析为一个\,所以'a\\b'代表字面量 a\b;而'a\b'中由于\之后是b,所以单引号不解析转义字符,所以会原样输出,因此 'a\b'也代表字符串字面量 a\b。

再来说一下双引号中的转义 双引号解析转义字符,所以 "\n\t\$" 代表的字符串字面量是 换行(非打印字符)制表符(非打印字符,相当于你按了一下Tab键)$(有特殊意义的字符)

正则表达式中的\是元字符,和^ $ * + () [] ? | . 一样有特殊意义,因此在正则中如果要匹配 \ 需要在前面转义,也就是 /a\\b/

由于php没有正则这个类型,php中的正则是写在字符串中的,这就会有一个问题,叫做双重转义,既然在字符串中和正则中\都是特殊字符,那么都需要转义,因此'/a\\\\b/'被php引擎解释为字符串字面量 /a\\b/,然后字符串 /a\\b/ 又被正则解释为 a\b,所以如果想匹配一个字符串字面量 a\b ,那么需要 $pattern = '/^a\\\\b$/';

那么有人会问了,正则当中的\需要双重转义,那其他元字符是不是也要双重转义呢?比如要想匹配一个字符串字面量 a^b 是不是要写成 $pattern = '/a\\^b/'; 可是我们为什么写成 $pattern = '/a\^b/'; 也可以呢?没错,以上两种方式都可以正确匹配字面量 a^b 。先看 '/a\\^b/' ,单引号字符串将它解释为 /a\^b/,然后正则将其解释为 a^b 。再看'/a\^b/',
单引号字符串将其解释为 /a\^b/ (因为\^会原样输出),而正则将其匹配为 a^b。所以如果遇到非反斜杠的其他元字符,例如(^ $ ()[] * + ? . |),在单引号里面的正则表达式里只需要加一个\即可,例如'/a\^b/';而如果遇到反斜杠\,在单引号里面的正则表达式里需要双重转义,例如 '/a\\\\b/' 。

我们上面提到了 '/a\\\b/' 也可以匹配字面量 a\b ,也就是说 '/a\\\b/' 和 '/a\\\\b/' 效果相同。这是因为 '/a\\\b/' 经过单引号字符串转义为 /a\\b/ (前两个 \\转义为一个\,后面的\b原样输出),/a\\b/ 再经过正则的转义匹配字符字面量 a\b。

例子:
$string = 'a\\b'; //代表字符串字面量 a\b
$pattern = '/^a\\\\b$/'; //匹配字符串字面量 a\b


if(preg_match($pattern,$string,$match)){
echo '找到匹配的字符串 '.$match[0];
}else{
echo '没有匹配的字符串';
}

例子:
$string = 'a\\^$#b'; //代表字符串字面量 a\^$#b
$pattern = '/^a\\\\\^\$#b$/'; // 前四个 \\\\经过单引号转义为两个 \\ 第五个\和后面的^ 也就是\^会原样输出,同理\$原样输出,所以经过单引号字符串转义为 /^a\\\^\$#b$/,再经过正则转义匹配字符串字面量 a\^$#b

if(preg_match($pattern,$string,$match)){
echo '找到匹配的字符串 '.$match[0];
}else{
echo '没有匹配的字符串';
}



/**********************************************************************************************************************************************************************

细说正则表达式下篇结束

**********************************************************************************************************************************************************************/


<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(127) | 评论(0) | 转发(0) |
0

上一篇:细说正则表达式上篇

下一篇:希望

相关热门文章
  • 程序员之路虽漫漫,吾以恒心而...
  • 谈谈varnish,squid,apache,ngi...
  • 免费送8美金交易账户(附账户...
  • 关于Nordfx诺德外汇各种出金方...
  • Perl命令行应用集锦
  • IP Sec VPN与NAT破镜重圆
  • 网站导航
  • GoAgent图文设置教程
  • UT2.0正式版下载
  • tomcat6.0配置(含配置视频下载...
  • 大家都是用什么来管理hadoop集...
  • 网站被人挂了吗,添加了些程序...
  • Nginx如何保证不走宕机的那个...
  • 大家谈谈MYSQL客户端和服务器...
  • 以下代码运行后为何会输出5?...
给主人留下些什么吧!~~
评论热议

这篇关于细说正则表达式下篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074362

相关文章

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

匹配电子邮件地址的正则表达式

这个正则表达式 QRegularExpression regex(R"((\w+)(\.|_)?(\w+)@(\w+)(\.(\w+))+))"); 用于匹配电子邮件地址的格式。下面是对这个正则表达式的逐步解析和解释: 1. QRegularExpression 构造函数 QRegularExpression regex(R"((\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+

notepad++ 正则表达式多条件查找替换

基础语法参考: https://www.cnblogs.com/winstonet/p/10635043.html https://www.linuxidc.com/Linux/2019-05/158701.htm   通常情况下我们查找的内容和要被替换掉的内容是一样的,我们只需要使用正则表达式精确框定查找内容,替换直接输入要替换的内容即可。 但有时会比较复杂,查找的内容,只需要替换其中

js正则表达式test方法的问题

今天在网上碰到一个帖子,写了一个关于Regex的奇怪现象,(文章来源http://www.php100.com/html/webkaifa/javascript/2007/0109/1866.html) 代码如下 <script type="text/javascript"><!--var re = /^\d+(?:\.\d)?$/ig; alert(re.test('112.3'

Java利用正则表达式获取指定两个字符串之间的内容

package com.starit.analyse.util;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;public class DealSt

在亚马逊云科技上利用Agent和生成式AI写小说(下篇)

今天小李哥将继续介绍亚马逊推出的国际前沿人工智能AI大模型平台Amazon Bedrock上的Agent的功能。我们将利用Agent结合应用代码工作流服务Step Functions创建链式提示词(Prompt Chaining),通过提示词执行一系列调用Amazon Bedrock上AI大模型的操作写一篇小说。其中架构前端使用了Streamlit框架开发,为用于提供了写小说的交互界面。整个项目的

AS3中正则表达式中如何表达“或”

var reg:RegExp=/\r|\n|\t/g;                 var msg:String="123\rabc\n\tabc\ta\123";                 msg=msg.replace(reg,"");                 trace(msg);

as3 正则表达式(比较齐全)

正则表达式是AS3比较重要的一个部分,具体内容如下:   //正则表达式有四个部分。1元子符。2元序列。3标志。4数量表达符。 //下面是元字符部分 //现在我们来看看元字符: ^ $ \ . * + ? ( ) [ ] { } | //^匹配字符串的开头 varpattern:RegExp=/^小虫/; var str:String="小虫是好人"; trace(str, " is