正则笔记

字符边界

  • 正则表达式其实就是字符串规则表达式
  • 构成:’/正则匹配规则/’
字符含义
^匹配字符串的开始
$匹配字符串的结尾
\b匹配单词是的开始和结尾(边界)
\B匹配字符串的非边界

常用字符簇

代表
.(点)任意字符,不含换行
\w[a-z A-Z 0-9 _ ]
\W\w的补集
\s空白符,包括 \n\r\t\v等
\S非空白符
\d[0-9]
\D非数字
  • 空白符:空格,回车,换行,tap键

集合

$array = array('12345','465156','4564155','546516');
$patt = '/^[123456]{6}$/';
//匹配字符串的开始结尾^$,[]里的是要匹配的字符串集合,{6}指匹配6位数的字符串
foreach ($array as $key => $value) {
	preg_match_all($patt, $value, $matches);
	var_dump($matches);

}

补集

//例[^47]匹配不含4和7的
$array = array('12345','465156','4564155','546516');
$patt = '/^[^37]{6}$/';

foreach ($array as $key => $value) {
	var_dump($value);
	# code...
	preg_match_all($patt, $value, $matches);
	var_dump($matches);
}

字符范围

$str = 'baidu o2o b2b c2c shuai chou nishishabi';
//$patt = '/\b[a-zA-Z]+\b/';//要找出纯字母组成的单词,+号表示字数不限
$patt = '/\b[a-zA-Z]{3,}\b/';//要找出至少由3个字母组成的单词,{3,}表示字数>=3

preg_match_all($patt, $str, $matches);
var_dump($matches);

字符簇

// 系统定义好的一些常用集合
// \w [a-zA-Z0-9_]
// \W \w的补集(即匹配不在\w集合内的字符串)
/*$str = 'tommorw is    another day , o2o , you dont bird me i dont bird you';
$patt = '/\W{1,}/';//匹配字数>=1的不为[a-zA-Z0-9_](\w的补集)的字符串
preg_match_all($patt, $str, $matches);
var_dump($matches);

找几个

// *: 匹配前面的子表达式零次或多次
// +: 匹配前面的子表达式一次或多次
// \?:匹配前面的子表达式零次或一次
// {n}:n是一个非负整数,匹配确定的n次
// {n,m}:m和n均为非负整数,其中n<=m,最少匹配n次且最多匹配m次
// {n,} :n是一个非负整数,至少匹配n次
/*$patt = '/[a-zA-Z]{5}/';//匹配5个字母组成的单词
$patt = '/[a-zA-Z]{3,5}/';//匹配3-5个字母组成的单词;
$patt = '/[a-zA-Z]{5,}/';//匹配5个以上字母组成的单词

//案例,某编辑部的键盘坏了,o键弹不出来,经常打出多个0,于是god经常打成good,gooooood,gooooooood,请把这些单词替换成god
//preg_replace($patt,$string,$object)//正则匹配替换
$str = "gooooooood goood god gooooooood";
$patt = '/[o]{1,}/';//这样是把1个以上o替换成一个o,题目是指将goood即g跟d中间的多个o替换成一个o
$patt = '/go+d/';
var_dump(preg_replace($patt, 'god', $str));

或者

//或者:|
$str = 'hello o2o 2b9 250';
//找出纯数字或者纯字母的
$patt = '/\b[a-zA-Z]+\b|\b[0-9]+\b/';
preg_match_all($patt, $str, $matches);
var_dump($matches);

贪婪与非贪婪

//贪婪与非贪婪(?) 正则默认是贪婪模式
//贪婪模式:会尽量多的匹配
//非贪婪模式:在数量(+ * {n,})限定符后加?,表示非贪婪模式
$str = 'kjsh god goooood goood good ks ks sjd ';
//把g开头d结尾的找出来
$patt = '/g.+d/';//.表示任意字符 这里会将第一个g开始 最后一个d结尾的中间的都匹配出来,这就是贪婪模式。这里得到的是god goooood goood good ks ks sjd
$patt = '/g.+?d/';//加个?表示非贪婪模式,这样能够将每一个g开头d结尾的串一个一个以数组的形式返回
preg_match_all($patt, $str, $matches);
var_dump($matches)

采集手机号

$str = '老王电话13800138000, 备用电话18902587413, QQ:258963,emai l:wang@qq.com, 唯一号:10113497912123039';
//手机号正则
$patt = '/\b1[3578]\d{9}\b/';//\d表示集合[0-9];
preg_match_all($patt, $str, $matches);
var_dump($matches);

后向引用

//简化版 先找首尾字母都是t的
$str = 'txt hello,high,bom , mum';
$patt = '/\bt\w+t\b/';
preg_match_all($patt, $str, $matches);
var_dump($matches);
//找首尾字母相同的单词
$str = 'txt hello,high,bom , mum';
$patt = '/\b([a-z])\w+\1\b/';//后向引用:在需要后面引用的集合前后加上(),后面的\1表示引用第一个()里取到的字符,如果是\2则表示引用第二个()里取到的字符
preg_match_all($patt, $str, $matches);
var_dump($matches);

//把手机号中间4位替换为*
$str = '13800138000,13426060134';
$patt = '/(\d{3})\d{4}(\d{4})/';
preg_match_all($patt, $str, $matches);
//var_dump($matches);
var_dump(preg_replace($patt, '\1****\2', $str));//preg_replace也能使用后向引用,能够匹配第一个正则规则的()

模式

//模式修饰符,可以一定程度上影响正则的解析行为
//i模式:代表正则不区分大小写,'/[a-zA-Z]+/'-->'/[a-z]+/i'
/*$str = "hello WORLD ChiNA";
$patt = '/\b[a-z]+\b/i';
preg_match_all($patt, $str, $matches);
var_dump($matches);
//s模式:单行模式,就代表把整个文件看成一个‘单行’
$str = 'hello WORLD
 ChiNA';
$patt = '/\b.+\b/s';
preg_match_all($patt, $str, $matches);
var_dump($matches);
//u模式:把传入的参数看成是unicode字符集的编码,可以判断中文
//php下正则匹配中文,u模式,\x{4e00}-\x{9fa5}
$str = '三下手机s';
//\x{}:代表表示的是unicode编码而不是字符串
$patt = '/^[\x{4e00}-\x{9fa5}]+$/u';//匹配中文,在unicode表里中文编码从4e00开始到9fa5结束
echo preg_match($patt,$str)?'纯中文':'混合';

预查

//把ing结尾的单词词根部分(即不含ing部分)找出来
//不用预查自己试了下
$str = "hello ,when i am working, do not coming";
$patt = '/\b(\w+)ing\b/'; //出来的数组第一个是匹配结果,第二个就是我们要的词根(第一个引用)了;
//使用预查(?)
//实现原理(基于所在光标):前瞻(往前看) 断言(判断会是什么) 正预测(是什么样,负预测--不是什么) 零宽度(没有消耗字符)
$patt = '/\b\w+(?=ing\b)/';//判断后面是否是ing结尾的,是则能匹配,第一个\b->单词开头,第二个\b->单词结尾.这样可以直接返回ing前面的单词词根


//把不是ing结尾的单词找出来
//零宽度 负预测 前瞻 断言
$patt = '/\b\w+(?!ing)\w{3}\b/'; //1.要判断是不是ing结尾至少需要3个字符,所以i am 也不符合规则 

//把un开头的单词词根找出来
//零宽度 正预测 回顾(返回来看) 断言
$str = 'luck ,unlucky,state , unhappy';
$patt = '/(?<=\bun)\w+\b/';//<表示往后看,即取un后的词根

//把不是un开头的单词找出来
//零宽度 负预测 回顾(返回来看) 断言
$patt = '/\b\w{2}(?<!un)\w+\b/';

preg_match_all($patt, $str, $matches);
var_dump($matches);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python正则表达式的判断可以使用re模块。该模块提供了一系列函数来操作正则表达式。常用的函数有match()、search()和findall()等。match()函数用于判断一个字符串是否与正则表达式匹配,search()函数用于在字符串中搜索匹配正则表达式的内容,findall()函数用于在字符串中查找所有匹配正则表达式的内容。 另外,正则表达式中还有一些特殊字符和转义字符,比如^、$、*、+、?、.等,它们在正则表达式中有特殊的含义。例如^表示字符串的开始,$表示字符串的结束,*表示匹配0个或多个前面的字符。要注意,正则表达式中的特殊字符需要使用转义字符\来进行转义,例如\*表示匹配字面上的*。 总结来说,Python正则表达式的判断可以使用re模块的函数,同时需要注意正则表达式中的特殊字符和转义字符的使用。编写正则表达式时,需要仔细理解正则表达式的语法规则,并注意不同规则之间的细微差别。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python 正则式学习笔记](https://blog.csdn.net/whycadi/article/details/2011046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值