元字符

抛出问题: \d 代表匹配一个字符。而我现在想要匹配十个八个,任意多个数字肿么办?

这个时候我们就要用到元字符。在使用原子的时候,发现只能够匹配一个字符,可是要匹配多个字符就出现了问题。大理石平台支架
这个时候,我们需要借助元字符来帮我们修饰原子,实现更多的功能。

先不要被下面的这些给吓到。我们一点一点做实验,就全明白了。主要是这几个得多用用。
自己准备个小卡片,帮助自己记忆是最好的。

我们来看:

元字符 功能说明
* 是代表匹配前面的一个原子,匹配0次或者任意多次前面的字符。
+ 匹配一次或多前前面的一个字符
? 前面的字符可有可无【可选】 有或没有
. 更标准一些应该把点算作原子。匹配除了\n以外的所有字符
或者。注:它的优先级最低了。
^ 必须要以抑扬符之后的字符串开始
$ 必须要以$之前的字符结尾
\b 词边界
\B 非边界
{m} 有且只能出现m次
{n,m} 可以出现n到m次
{m,} 至少m次,最大次数不限制
() 改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它

+ 匹配最少1次前面的字符

<?php
$zz = '/\d+/'; $string = "迪奥和奥迪250都是我最爱"; //待会儿再试试中间没有0-9的情况
//$string = "迪奥和奥迪都是我最爱"; if(preg_match($zz, $string, $matches)){
   echo '匹配到了,结果为:';
   var_dump($matches);
}else{
   echo '没有匹配到';
} ?>

匹配成功,证明了\d+中的+。\d是匹配数字,而+是最少匹配一次前面的字符。

* 匹配0次或者任意多次前面的字符

<?php
$zz = '/\w*/'; $string = "!@!@!!@#@!$@#!"; //待会儿再试试中间没有0-9的情况
//$string1 = "!@#!@#!abcABC#@#!"; if(preg_match($zz, $string, $matches)){
   echo '匹配到了,结果为:';
   var_dump($matches);
}else{
   echo '没有匹配到';
} ?>

说明,注释掉的$string1和$string都匹配成功了。因为,\w是匹配的0-9A-Za-z_,而*是说明前面的\w可以不存在。如果存在可以有1个或者多个。

? 前面的字符出现0次或者1次,可有可无

<?php

$zz = '/ABC\d?ABC/';

$string = "ABC1ABC";

//待会儿再试试中间没有0-9的情况
//$string1 = "ABC888888ABC";
//$string2 = "ABCABC"; if(preg_match($zz, $string, $matches)){
   echo '匹配到了,结果为:';
   var_dump($matches);
}else{
   echo '没有匹配到';
} ?>

匹配$string,$string2成功,但是匹配$string1失败。
因为匹配前后都是ABC,中间是一个0-9。0-9可有可无,但是不能有多个。

. (点) 匹配除\n以外的所有字符

<?php

$zz = '/gg.+gg/';

$string = "ABC1ABC";

if(preg_match($zz, $string, $matches)){
   echo '匹配到了,结果为:';
   var_dump($matches);
}else{
   echo '没有匹配到';
} ?>

匹配$string,$string2成功,但是匹配$string1失败。
因为匹配前后都是ABC,中间是一个0-9。0-9可有可无,但是不能有多个。

|(竖线),或者,优先级最低

我们通过实验来看优先级和或者的匹配

<?php

$zz = '/abc|bcd/';

$string1 = "abccd";
$string2 = "ggggbcd"; if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

我们来看看:

1.最开始我匹配的想法是想匹配的是abccd或者是abbcd。可是,匹配$string1和$string2,匹配出来的结果却是abc和bcd.

2.实现了或者匹配,匹配出来了abc或者是bcd。它还没有字符串连续在一起的优先级高。

那么问题来了,我要匹配上例中的abccd或者是abbcd怎么办?

需要使用到() 来改变优先级。

<?php

$zz = '/ab(c|b)cd/';

$string1 = "起来abccd阅兵";
$string2 = "ggggbcd";
$string3 = '中国abbcd未来'; if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

结果如下:

结论:

1.确实匹配了了abccd或者abbcd($string1 or $string3)。

2.但是匹配的数组里面多了一个元素,这个元素的下标为1

3.()中的内容只要匹配成功,会把匹配到的数据放到下标为1的这个数组元素中。

^ (抑扬符),必须要以^之后的字符串开始

<?php

$zz = '/^猪哥好帅\w+/';

$string1 = "猪哥好帅abccdaaaasds";
//$string2没有以猪哥好帅开始
$string2 = "帅abccdaaaasds"; if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

通过实验发现以下结论:

1.$string1匹配成功,$string2没有匹配成功

2.因为$string1是以指定的字符开始的

3.而$string2并没有以^之后的字符开始

4.翻译这个正则的意思就是:以要猪哥好帅开始后面接a-zA-Z0-9_最少一个字符。

$ (美元符)必须要以$之前的字符结束

<?php

$zz = '/\d+努力$/';

$string1 = "12321124333努力";
//$string2
$string2 = "12311124112313力"; if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

我们运行一下看一下结果,得出来的结论:

1.$string1 匹配成功,而$string2匹配不成功

2.$之前的字符是\d+,后面接着中文的努力。

3.因此,匹配的是这一个整体。\d指的是0-9的整型,+号代表最少一个0-9

\b和\B 词边界和非词边界

我们来讲解什么是边界:

1.正则表达示是有边界的,这个边界是定界符的开始和结尾是正则的边界。

2.this是一个英文单词,后面加上一个空格,意味着这个词结束了,到达了这个词的边界

\b词边界,就是指必须要在最前或者最后。
\B非边界,就是不能在一个正则表达示的最前或者最后。

<?php

$zz = '/\w+\b/';

$string1 = "this is a apple";
$string2 = "thisis a apple";
$string3 = "thisisaapple"; if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

结论:

1.$string1、$string2和$string3都匹配成功。

2.$string1匹配的时候this 空格是边界

3.$string2匹配的时候thisis是边界

4.$string3匹配的时候,thisisaapple到了整个正则表达示的最后,因此也是边界。所以匹配成功。

我们来实验一下非词边界:

<?php

$zz = '/\Bthis/';

$string1 = "hellothis9";

//$string2 = "hello this9";
//$string2 = "this9中国万岁"; if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

总结:

1.匹配$string1成功而$string2不成功。

2.因为\B后接的是this,所以this不能在词边界(空格和开始结尾)的位置出现。

{m}有且只能出现m次

<?php

$zz = '/喝\d{3}酒/';

$string1 = "喝988酒";

//$string2 = "喝98811酒";

if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

结论:
上例中\d{3}我规定了0-9只能出现3次,多一次少一次都不行。

{n,m} 可以出现n到m次

<?php

$zz = '/喝\d{1,3}酒/';

$string1 = "喝9酒";

//$string2 = "喝988酒";

if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

结论:
上例中\d{1,3}我规定了0-9只能出现1次,2次或者3次。其它次数都是错的

{m,} 至少m次,最大次数不限制

<?php

$zz = '/喝\d{2,}/';

$string1 = "喝9";

//$string2 = "喝98";
//$string3 = "喝98122121"; if (preg_match($zz, $string1, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
} ?>

结论:
上例中\d{2,}我规定喝后面的0-9最少出现两次,最多次数不限。因此$string1是匹配不成功的,$string2是匹配成功的。$string3是匹配成功的。

php正则表示中的元字符的更多相关文章

  1. Linux中的元字符和转义符 单引号 硬引号 双引号 软引号

    Linux中的元字符和转义符  单引号  硬引号  双引号  软引号 Linux就这个范儿 Linux就这个范儿 P182单引号:硬引号,所有元字符特殊意义都会关掉双引号:软引号,只允许出现特定元字符 ...

  2. C#或Python中正则表达式元字符含意

    一.列表 元字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 ' ...

  3. <摘录>perl正则表达式中的元字符、转义字符、量词及匹配方式

    Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式. 元 ...

  4. 【Perl】perl正则表达式中的元字符、转义字符、量词及匹配方式

    Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式. 元 ...

  5. R语言学习笔记(二十一):字符串处理中的元字符(代码展示)

    元字符有自己的特殊含义 [ ]内的任意字符将被匹配 grep(pattern = "[wW]", x = states, value = T) grep(pattern = &qu ...

  6. 备忘:js正则表达式中的元字符

    Predefined term Matches \t Horizontal tab \b Backspace \v Vertical tab \f Form feed \r Carriage retu ...

  7. java中regex参考

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu ...

  8. JavaScript中的正则表达式(终结篇)

    JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScri ...

  9. Python::re 模块 -- 在Python中使用正则表达式

    前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...

随机推荐

  1. Django-11-Form组件

    1. 概述 Django的Form组件一般功能有: 验证用户输入 生成html代码 返回错误信息 创建Form类 from django.shortcuts import render, redire ...

  2. sqlite 安装与编译

    本文简述了SQLite的概念,并详细描述了SQLite在Linux和Windows平台下的编译方法 关于 SQLite SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 ...

  3. python3 安装 pyinstaller 时报错的解决办法

    如上图所示,在安装的过程中发现是所关联的一个 future模块安装失败,庵后我有单独安装了一下这个future,发现还是失败 然后在网上寻找解决办法,最后找到了这个指令,pip install fut ...

  4. WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性)

    原文:WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性) 本文介绍如何使用 Windows 的 AppBar 相关 API 实现固定停靠在桌面上的特殊窗 ...

  5. C# vb .net实现圆角矩形特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的圆角矩形效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  6. C# vb .net实现焦距淡色特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的焦距淡色效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  7. Python进阶(十二)----re模块

    Python进阶(十二)----re模块 一丶re模块 ​ re模块是python将正则表达式封装之后的一个模块.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. #正则表达式: ...

  8. pathlib的使用

    目录 一. Python2与Python3的路径处理的对比 二. pathlib的几个使用示例 1. 最简单的使用 2. 追加路径到Python的sys.path中 3. 生成目录树的技巧 4. 递归 ...

  9. JAVA基础之HttpServletRequest请求

    HttpServletRequest请求是获取请求行.请求头和请求体:可以通过这个方法设置防盗链,获取地址.牢记解决乱码的方式. 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持reques ...

  10. CSS 滑动门案例

    一.什么是滑动门特效 为了使各种特殊形状的背景能够自适应元素中文本内容的多少,出现了CSS滑动门技术.它从新的角度构建页面,使各种特殊形状的背景能够自由拉伸滑动,以适应元素内部的文本内容,可用性更强. ...