正则表达式 (39)

正则表达式简介:

??正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。
??在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。

??PHP中,正则表达式有三个作用:

??匹配,也常常用于从字符串中析取信息。
??用新文本代替匹配文本。
??将一个字符串拆分为一组更小的信息块。
??一个正则表达式中至少包含一个原子

在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:

??一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数;
??一套由POSIX(Portable Operating System Interface of Unix)扩展提供的。使用以“ereg_”为前缀命名的函数;
??使用正则表达式的原因之一,是在典型的搜索和替换操作中,只能对确切文字进行匹配,对象动态文本的搜索就有困难了,甚至是不可能的。

正则表达式的语法规则

PCRE正则表达式:
??PCRE全称为Perl Compatible Regular Expression,意思是Perl兼容正则表达式。
??PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。
??PCRE语法支持更多特性,比POSIX语法更强大,实现相同的功能函数,使用PCRE库的效率略占优势。但是它们也有很多相同点。
??在PCRE中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。用户只要把需要匹配的模式内容放入定界符之间即可。作为定界的字符也不仅仅局限于“/”。除了字母、数字和斜线“\”以外的任何字符都可以作为定界符,像“#”、“|”、“!”等都可以的。

原子(Atom)

原子是组成正则表达式的基本单位,在分析正则表达式时,应作为一个整体。
??原子字符包括所有的英文字母、数字、标点符号以及其他一些符号。原子也包括以下内容。
??单个字符、数字,如a-z,A-Z,0-9。
??模式单元,如(ABC)可以理解为由多个原子组成的大的原子。
??原子表,如[ABC]。
??重新使用的模式单元,如:\\1
??普通转义字符,如:\d,\D,\w
??转义元字符,如:\*,\.

普通转义字符

原子说明
-----------------------------------------------------------------
\d  匹配一个数字;等价于[0-9]
\D  匹配除数字以外任何一个字符;等价于[^0-9]
\w  匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_]
\W  匹配除英文字母、数字和下划线以外任何一个字符;等价于[^0-9a-zA-Z_]
\s  匹配一个空白字符;等价于[\f\n\r\t\v]
\S  匹配除空白字符以外任何一个字符;等价于[^\f\n\r\t\v]
\f  匹配一个换页符等价于\x0c 或\cL
\n  匹配一个换行符;等价于\x0a 或\cJ
\r  匹配一个回车符等价于\x0d 或\cM
\t  匹配一个制表符;等价于\x09\或\cl
\v  匹配一个垂直制表符;等价于\x0b或\ck
\oNN  匹配一个八进制数字
\xNN  匹配一个十六进制数字
\cC  匹配一个控制字符

元字符(Meta-character)

元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上”\”进行转义
元字符说明
-----------------------------------------------------------------
*   0次、1次或多次匹配其前的原子
+   1次或多次匹配其前的原子
?  0次或1次匹配其前的原子
|  匹配两个或多个选择
^   或\A匹配字符串串首的原子
$   或\Z 匹配字符串串尾的原子
\b  匹配单词的边界
\B  匹配除单词边界以外的部分
[]  匹配方括号中的任一原子
[^]  匹配除方括号中的原子外的任何字符
{m}  表示其前原子恰好出现m次
{m,n}  表示其前原子至少出现m次,至少出现n次(n>m)
{m,}  表示其前原子出现不少于m次
()  整体表示一个原子
.  匹配除换行之外的任何一个字符

字符串边界限制

在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。“^”和“$”分别指定字符串的开始和结束。
??例如,在字符串“Tom and Jerry chased each other in the house until tom’s uncelcome in”中
??元字符“^”或“\A”置于字符串的开始确保模式匹配出现在字符串首端;
/^Tom/
??元字符“$”或“\Z”置于字符串的结束,确保模式匹配出现字符串尾端。
/in$/
??如果不加边界限制元字符,将获得更多的匹配结果。
/^Tom$/精确匹配  /Tom/模糊匹配

单词边界限制

在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。
??例如:在字符串“This island is a beautiful land”中
??元字符“\b”对单词的边界进行匹配;
/\bis\b/ 匹配单词“is”,不匹配“This”和“island”。
/\bis/匹配单词“is”和“island”中的“is”,不匹配“This”
??元字符“\B”对除单词边界以外的部分进行匹配。
/\Bis\B/ 将明确的指示不与单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有结果。
/\Bis/匹配单词“This”中的“is”

重复匹配

正则表达式中有一些用于重复匹配某些原子的元字符:“?”、“*”、“+”。他们主要的区别是重复匹配的次数不同。
??元字符“?”:表示0次或1次匹配紧接在其前的原子。
例如:/colou?r/匹配“colour”或“color”。
??元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。
例如:/zo*/可以匹配z、zoo
??元字符“+”:表示1次或多次匹配紧接在其前的原子。
例如:/go+gle/匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。

任何一个字符

元字符“.”匹配除换行符外任何一个字符。
??相当于:[^\n](Unix系统)或[^\r\n](windows系统)。
??例如:/pr.y/可以匹配的字符串“prey”、“pray”或“pr%y”等。
??通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符”或“单含匹配符”。
??例如:
??/^a.*z$/表示可以匹配字母“a”开头,字母“z”结束的任意不包括换行符的字符串。
??/.+/也可以完成类似的匹配功能所不同的是其至少匹配一个字符。
??/^a.+z$/匹配“a%z”不匹配字符串“az”

原子表-方括号表达式

原子表”[]”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个”a”或”e”使用[ae]。
??例如: Pr[ae]y匹配”Pray”或者”Prey ”。
??原子表”[^]”或者称为排除原子表,匹配除表内原子外的任意一个字符。
??例如:/p[^u]/匹配“part”中的“pa”,但无法匹配“computer”中的“pu”因为“u”在匹配中被排除。
??原子表“[-]”用于连接一组按ASCII码顺序排列的原子,简化书写。
??例如:/x[0123456789]/可以写成x[0-9],用来匹配一个由“x”字母与一个数字组成的字符串。
??例如:
??/[a-zA-Z]/匹配所有大小写字母
??/^[a-z][0-9]$/匹配比如“z2”、“t6”、“g7”
??/0[xX][0-9a-fA-F]/匹配一个简单的十六进制数字,如“0x9”。
??/[^0-9a-zA-Z_]/匹配除英文字母、数字和下划线以外任何一个字符,其等价于\W。
??/0?[ xX][0-9a-fA-F]+/匹配十六进制数字,可以匹配“0x9B3C”或者“X800”等。
??/<[A-Za-z][A-Za-z0-9]*>/可以匹配“<P>”、“<hl>”或“<Body>”等HTML标签,并且不严格的控制大小写。

模式选择符

元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。
??例如:
??在字符串“There are many apples and pears.”中,/apple|pear/在第一次运行时匹配“apple”;再次运行时匹配“pear”。也可以继续增加选项,如:/apple|pear|banana|lemon/

模式单元

元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。
??例如:
??/(Dog)+/匹配的“Dog”、“DogDog”、“DogDogDog”,因为紧接着“+”前的原子是元字符“()”括起来的字符串“Dog”。
??/You (very )+ old/匹配“You very old”、“You very veryold”
??/Hello (world|earth)/匹配“Hello world”、“Hello earth”
??一个模式单元中的表达式将被优先匹配或运算。

重新使用的模式单元

系统自动将模式单元“()”中的匹配依次存储起来,在需要时可以用“\1”、“\2”、“\3”的形式进行引用。当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成“\\1”、“\\2”
例如:
??/^\d{2}([\W])\d{2}\\1\d{4}$/匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式。这是因为模式“[\W]”的结果“/”已经被存储。下个位置“\1”引用时,其匹配模式也是字符“/”。
??当不需要存储匹配结果时使用非存储模式单元“(?:)”
??例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)\\2g/。

时间: 2024-11-01 11:07:42

正则表达式 (39)的相关文章

ESLint规则配置说明

1 "no-alert": 0,//禁止使用alert confirm prompt 2 "no-array-constructor": 2,//禁止使用数组构造器 3 "no-bitwise": 0,//禁止使用按位运算符 4 "no-caller": 1,//禁止使用arguments.caller或arguments.callee 5 "no-catch-shadow": 2,//禁止catch子句参

webpack构建Vue项目引入jQ时发生“&#39;$&#39; is defined but never used”的处理

今天公司需要新建个数据后台,就按照查到的方法构建了Vue框架的项目,引入jQ.bootstrap时,按照在线方法配置,发现 main.js 里的引用jQ一直显示红标,没多想,在按照网上配置完后,npm run dev运行,就抛出这么个错误,百思不得解 错误如下: '$' is defined but never used 1 http://eslint.org/docs/rules/space-before-function-paren 1 http://eslint.org/docs/rule

解决反射型XSS漏洞攻击

对于程序员来说安全防御,无非从两个方面考虑,要么前端要么后台. 一.首先从前端考虑过滤一些非法字符. 前端的主控js中,在<textarea> 输入框标签中,找到点击发送按钮后,追加到聊天panel前 进行过滤Input输入内容 1 // 过滤XSS反射型漏洞 2 filterInputTxt: function (html) { 3 html = html.replace(/(.*<[^>]+>.*)/g,""); // HTML标记 4 html =

Vue中ESlint配置文件eslintrc.js文件详解

最近在跟着视频敲项目时,代码提示出现很多奇奇怪怪的错误提示,百度了一下是eslintrc.js文件没有配置相关命令,ESlint的语法检测真的令人抓狂,现在总结一下这些命令的解释,方便以后查阅. 默认eslint规则: 代码末尾不能加分号 ;(强迫症的我受不了)代码中不能存在多行空行:(这个我更也忍不了)tab键不能使用,必须换成两个空格:(超级不习惯)代码中不能存在声明了但未使用的变量:(这个我觉得可以有) 最简单的方法,关闭eslint检测,其实很简单,把 build/webpack.bas

=-098765

http://ypk.39.net/search/all?k=%A1%B8%D4%E6%D1%F4%C3%D4%BB%C3%D2%A9%D4%F5%C3%B4%B9%BA%C2%F2Q%A3%BA%A3%B6%A3%B9%A3%B5%A3%B2%A3%B5%A3%B6%A3%B7%A3%B1%A3%B7%A8%7C http://ypk.39.net/search/all?k=%A8%93%D2%CB%B3%C7%C3%D4%BB%C3%D2%A9%D4%F5%C3%B4%B9%BA%C2%F2

JAVA正则表达式:Pattern类与Matcher类详解(转)

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

[正则表达式]基础知识总结

一直只是知道正则表达式的用途,但具体没使用过,今天稍微了解了下它的基础用法.这里总结一下. 命令空间:System.Text.RegularExpressions 用途: 对字符串进行查找和替换: 识别重复的单词: 转换格式: 区分一个字符串的各个子元素,并进行提取. RegEx类: 是对正则表达式引擎的类抽象,通过调用该抽象类的不同方法,实现对正则表达式的处理. 该类的主要方法如下所示,具体用途相信通过方法名即可知道: 了解完Regex类的主要方法后,还需要关注三个比较重要的类和它们的层次,分

JS正则表达式完整教程(略长)

JS正则表达式完整教程(略长) 引言 亲爱的读者朋友,如果你点开了这篇文章,说明你对正则很感兴趣. 想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准. 关于正则表达式的教程,网上也有很多,相信你也看了一些. 与之不同的是,本文的目的是希望所有认真读完的童鞋们,都有实质性的提高. 本文内容共有七章,用JavaScript语言完整地讨论了正则表达式的方方面面. 如果觉得文章某块儿没有说明白清楚,欢迎留言,能力范围之内,老姚必做详细解答. 具体章节如下: 引言 第一章 正则表

PHP常用正则表达式

正则表达式 是一大利器,参数验证,数据采集等很多地方都用到. 许多程序设计语言都支持利用正则表达式进行字符串操作.平常写程序经常用到正则表达式,就整理一些常用的正则表达式分享一下! 平时写程序经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: "^\d+$" //非负整数(正整数 + 0) "^[0-9][1-9][0-9]$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-