zoukankan      html  css  js  c++  java
  • 正则表达式的零宽向前、向后匹配

    正则中向前匹配和向后匹配非常强大好用。

    这里的向前意思是文本的右边,向后是文本的左边(正则引擎匹配按照左->右)。

    向前和向后匹配是非获取匹配,即匹配结果不包括这个内容。匹配过程中不消耗字符,不占字符。

    来来,举个栗子。

    <?php
    
    $a = '2abc3abc';
    
    // 匹配右边是abc的2  
    $re1 = preg_match('/2(?=abc)/', $a, $match);
    
    // 匹配的是2,没有abc
    var_dump($match);// array(1) { [0]=> string(1) "2" }
    <?php
    
    $a = '2abc3abc';
    
    $re = preg_match('/2(?=abc)3/', $a, $match);
    
    // 匹配失败 因为零宽匹配是不消耗字符
    var_dump($re);// int(0)
    
    // 这样才能匹配上 注意不消耗字符的含义
    // $re = preg_match('/2(?=abc)abc3/', $a, $match);
    //var_dump($re);// int(1)

    一些代码示例: 

    // 向右匹配
    // (?=)  匹配
    // (?!)  不匹配
    $str = "abcx1 abcy2 abcz3";
    
    // 匹配右边是y的abc
    $a = preg_replace('/abc(?=y)/', '0', $str);// abcx1 0y2 abcz3
    
    // 匹配右边不是y的abc
    $b = preg_replace('/abc(?!y)/', '1', $str);// 1x1 abcy2 1z3
    
    // ===================================
    
    // 向左匹配 注意有小于号
    // (?<=)  匹配
    // (?<!)  不匹配
    
    $str = "1xabc 2abc 3zabc";
    
    // 匹配左边一个字符是数字的abc
    $a = preg_replace('/(?<=d)abc/', '0', $str);// 1xabc 20 3zabc
    
    // 匹配左边一个字符不是数字的abc
    $b = preg_replace('/(?<!d)abc/', '1', $str);// 1x1 2abc 3z1
    
    
    // ===================================
    
    // 同时向前向后匹配
    
    $str = 'XXX13188887777YYY123ZZZ';// 找到一个1开头的11位数字,并且前后都不是数字的,在数字前加一个 mobile:
    
    // $1是刨除掉向前匹配的括号 注意
    $re = preg_replace('/(?<=[^0-9])(1d{10})(?=[^0-9])/', ' mobile:$1 ', $str);// XXX mobile:13188887777 YYY123ZZZ
    
  • 相关阅读:
    基于Token的WEB后台认证机制
    导出和导入Docker容器
    进入Docker容器
    介绍Docker容器
    Docker镜像的实现原理
    Docker 移除镜像
    存出和载入Docker镜像
    Docker 创建镜像
    Docker 列出镜像
    Docker如何获取镜像
  • 原文地址:https://www.cnblogs.com/firstForEver/p/6642865.html
Copyright © 2011-2022 走看看