PHP 正则表达式 基本规则

正则表达式基本知识:

    \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。     例如,‘n‘ 匹配字符 "n"。‘\n‘ 匹配一个换行符。序列 ‘\\‘ 匹配 "\" 而 "\(" 则匹配 "("。
    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n‘     或 ‘\r‘ 之后的位置。
    $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n‘     或 ‘\r‘ 之前的位置。
    * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
    + 匹配前面的子表达式一次或多次。例如,‘zo+‘ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。    + 等价于 {1,}。
    ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。    ? 等价于 {0,1}。
    {n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}‘ 不能匹配 "Bob" 中的 ‘o‘,但是能    匹配 "food" 中的两个 o。
    {n,} n 是一个非负整数。至少匹配n 次。例如,‘o{2,}‘ 不能匹配 "Bob" 中的 ‘o‘,但能匹配     "foooood" 中的所有 o。‘o{1,}‘ 等价于 ‘o+‘。‘o{0,}‘ 则等价于 ‘o*‘。
    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}"     将匹配 "fooooood" 中的前三个 o。‘o{0,1}‘ 等价于 ‘o?‘。请注意在逗号和两个数之间不能有空格。
    ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非    贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索    的字符串。例如,对于字符串 "oooo",‘o+?‘ 将匹配单个 "o",而 ‘o+‘ 将匹配所有 ‘o‘。
    . 匹配除 "\n" 之外的任何单个字符。要匹配包括 ‘\n‘ 在内的任何字符,请使用象 ‘[.\n]‘ 的模式。
    x|y 匹配 x 或 y。例如,‘z|food‘ 能匹配 "z" 或 "food"。‘(z|f)ood‘ 则匹配 "zood" 或 "food"。
    [xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]‘ 可以匹配 "plain" 中的 ‘a‘。
    [^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]‘ 可以匹配 "plain" 中的‘p‘。
    [a-z] 字符范围。匹配指定范围内的任意字符。例如,‘[a-z]‘ 可以匹配 ‘a‘ 到 ‘z‘ 范围内    的任意小写字母字符。
    [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,‘[^a-z]‘ 可以匹配任何不    在 ‘a‘ 到 ‘z‘ 范围内的任意字符。
    \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b‘ 可以匹配"never" 中    的 ‘er‘,但不能匹配 "verb" 中的 ‘er‘。
    \B 匹配非单词边界。‘er\B‘ 能匹配 "verb" 中的 ‘er‘,但不能匹配 "never" 中的 ‘er‘。
    \cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为     A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c‘ 字符。
    \d 匹配一个数字字符。等价于 [0-9]。
    \D 匹配一个非数字字符。等价于 [^0-9]。
    \f 匹配一个换页符。等价于 \x0c 和 \cL。
    \n 匹配一个换行符。等价于 \x0a 和 \cJ。
    \r 匹配一个回车符。等价于 \x0d 和 \cM。
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
    \t 匹配一个制表符。等价于 \x09 和 \cI。
    \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
    \w 匹配包括下划线的任何单词字符。等价于‘[A-Za-z0-9_]‘。
    \W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。
    \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,    ‘\x41‘ 匹配 "A"。‘\x041‘ 则等价于 ‘\x04‘ & "1"。正则表达式中可以使用 ASCII 编码。.
    \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1‘ 匹配    两个连续的相同字符。
    \n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后    引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
    \nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为    向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的    条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
    \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
    \un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

  子模式:

 (pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches   要匹配圆括号字符,请使用 ‘\(‘ 或 ‘\)‘。
 (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,   不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分   是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries‘    更简略的表达式。
 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。    这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,    ‘Windows (?=95|98|NT|2000)‘ 能匹配 "Windows 2000" 中的 "Windows" ,    但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,    在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从    包含预查的字符之后开始。
 (?!pattern) 正向不匹配,在任何不匹配 pattern 的字符串开始处匹配查找字符串。  这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如‘Windows (?!95|98|NT|2000)‘   能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。  预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,  而不是从包含预查的字符之后开始

  子模式匹配:

<?php
	$subject = "im 24 ap<pple>la";
	$pattern = "/<(.*)>/";
	$match   = [];

	$result = preg_match($pattern, $subject, $match);
	print_r($match);
	var_dump($result);

  输出:

不捕获子模式:

<?php
	$subject = "im 24 ap<pple>la";
	$pattern = "/<(?:.*)>/";
	$match   = [];

	$result = preg_match($pattern, $subject, $match);
	print_r($match);
	var_dump($result);

正向预查:匹配之前,现检查是否符合括号内规则的表达式,非捕获匹配

<?php
	$subject = "im 24 appple";
	$pattern = "/p(?=p)/";
	$match   = [];

	$result = preg_match($pattern, $subject, $match);
	print_r($match);
	var_dump($result);

输出: 注意这里是‘p’

正向不匹配

<?php
	$subject = "im 24 appple";
	$pattern = "/p(?!p)le/";
	$match   = [];

	$result = preg_match($pattern, $subject, $match);
	print_r($match);
	var_dump($result);

  输出:

反向预查
(?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java7
(?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java7

反向预查:匹配之前要保证前面符合子模式条件,即和子模式中匹配。

<?php
	$subject = "im 24 appple";
	$pattern = "/(?<=p)le/";
	$match   = [];

	$result = preg_match($pattern, $subject, $match);
	print_r($match);
	var_dump($result);

 运行:

反向不匹配:

<?php
	$subject = "im 24 appple";
	$pattern = "/a(?<!p)p/";
	$match   = [];

	$result = preg_match($pattern, $subject, $match);
	print_r($match);
	var_dump($result);

  运行:

贪婪模式

.*? 正则引擎默认是贪婪的,当出现"*"时,它会尽量去匹配尽可能长的字符串 一个用于修正以上问题的可能方案是用"*"的惰性代替贪婪性。你可以在"*"后面紧跟一个问号"?"来达到这一点 这告诉正则引擎,尽可能少的重复上一个字符

通过 ? 号可以表示尽可能的匹配最少的长度。

<?php
	$subject = "im 24 appple";
	$pattern = "/im.*p/";
	$pattern_no = "/im.*?p/";
	$match   = [];
	$match_no = [];

	preg_match($pattern, $subject, $match);
	preg_match($pattern_no, $subject, $match_no);

	print_r($match);
	print_r($match_no);

  运行:

时间: 2024-10-07 00:43:21

PHP 正则表达式 基本规则的相关文章

C#中不同格式数据校验的正则表达式

网上经常看到用正则表达式校验数据的文章,有的虽然总结得很全,但是大多数都没有经过严格验证,错误较多. 本文包含三十余条不同格式数据校验的C#正则表达式,一般均附有说明,且在Visual Studio里面跑过. 正则表达式基本规则对照表: /*说明:1.下面的正则都是以^开头,以$结尾,说明是把整个字符串拿来匹配.2.下面的正则表达式前都应该加@,例如:bool reg = Regex.IsMatch("35_ab", @"^[0-9a-zA-Z_]{1,}$");3

构造可配置词法语法分析器生成器(上)

本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo 前言 源程序在被编译为目标程序需要经过如下6个过程:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成.词法分析和语法分析是编译过程的初始阶段,是编译器的重要组成部分,早期相关理论和工具缺乏的环境下,编写词法语法分析器是很繁琐的事情.上世纪70年代,贝尔实验室的M. E. Lesk,E. Schmidt和Stephen C. Johnson分别为Unix系统编写了词法分析器生成器Le

Java基础知识强化72:正则表达式之概述和基本规则

A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') B:字符类 [abc] a.b 或 c(简单类) [^abc] 任何字符,除了 a.b 或 c(否定) [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) [0-9] 0到9的字符都包括 C:预定义字符类 . 任何字符.我的就是.字符本身,怎么表示呢? \. \d 数字:[0-9] \w 单词字符:[a-zA-Z_0-9] 在正则表

正则表达式部分特征实现设计实验

正则表达式 http://www.regexlab.com/zh/regref.htm 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征.比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征. 正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址.(2)用来查找字符串,从一个长的文本中查找符

[原]正则表达式模式匹配入门

介绍 在实际项目中有个功能的实现需要解析一些特定模式的字符串.而在已有的代码库中,在已实现的部分功能中,都是使用检测特定的字符,使用这种方法的缺点是: 逻辑上很容易出错 很容易漏掉对一些边界条件的检查 代码复杂难以理解.维护 性能差 看到代码库中有一个cpp,整个cpp两千多行代码,有个方法里,光解析字符串的就有400余行!一个个字符对比过去,真是不堪入目.而且上面很多注释都已经过期,很多代码的书写风格也各不相同,基本可以判断是过了很多人手的. 在这种情况下,基本没办法还沿着这条老路走下去,自然

Python中的正则表达式(re)

import re re.match #从开始位置开始匹配,如果开头没有则无 re.search #搜索整个字符串 re.findall #搜索整个字符串,返回一个list 举例: r(raw)用在pattern之前,表示单引号中的字符串为原生字符,不会进行任何转义 re.match(r'l','liuyan1').group() #返回l re.match(r'y','liuyan1') #返回None re.search(r'y','liuyan1').group() #返回y 正则表达式可

linux学习---正则表达式与grep

正则表达式(Regular Expression(RE)) 是透过一些特殊字符的排列, 用以"搜寻/取代/删除"一列或多列文字字符串, 简单的说, 正则表达式就是用在字符串的处理上面的一项"表达式". 正则表达式并不是一个工具程序, 而是一个字符串处理的标准依据, 如果想要用用正则表达式处理字符串, 就要使用支持正则表达式的工具程序, 这样的程序有很多, 如vi, awk, grep, sed... grep 基本规则: grep [-acinv] [--color

JavaScript正则表达式入门

工作中,正则表达式用的可能不是很多,一般使用的时候网上都有现成的实例,很少缺乏比较全面的理解.本文主要以匹配HTML标签为例,简述下正则表达式常用的功能点.匹配HTML片段如下: let str = ` <div id="app"> <div>21</div> <h1> <span>hello</span> <span>smile</span> </h1> <button&

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4