正则表达式的零宽向前、向后匹配

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

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

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

来来,举个栗子。

<?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])(1\d{10})(?=[^0-9])/', ' mobile:$1 ', $str);// XXX mobile:13188887777 YYY123ZZZ

 

转载于:https://www.cnblogs.com/firstForEver/p/6642865.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值