比较实用的正则表达式学习笔记

//匹配文本,这个偶尔比较好用,但是要小心字符中包含\E
$str = '[a-z]';
$str = preg_replace('/\G[a-z]\E/', '', $str);
echo $str; //打印空,全被替换掉了,相关大概就是preg_quote功能

//给匹配结果命名,这样在匹配结果中就可以用这个名称来获取值
$str = 'abc123abc';
preg_match('/(?P<num>\d+)/', $str, $arr);
echo $arr['num']; //相当于echo $arr[1]

//仅用于分组的括号,匹配内容不会被变量捕获,有时候需要这样提高执行效率
$str = 'abc123abc';
preg_match('/abc(?:\d+)/', $str, $arr);
echo $arr[1]; //除了$arr[0]外没有$arr[1]了,不会赋予\1

//插入的好帮手,向前、向后锚点搜索位置,每3位添加一个逗号
$str = 'fdfad123456789fdfd';
$str = preg_replace('/(?<=\d)(?=(\d{3})+(?!\d))/', ',', $str);
echo $str; //打印 fdfad123,456,789fdfd

//以最少的结果匹配
$str = 123456;
preg_match('/\d+/', $str, $arr);
echo $arr[0]; //是人都知道是123456吧
preg_match('/\d+?/', $str, $arr);
echo $arr[0]; //这次是1

//一个比较有用的,可以判断前面的是否有匹配过,比如下边的例子,可以忽略等号右边是否有单引号双引号或者什么都没有
$str = <<<HTML
<font size=12></font>
<font size='13'></font>
<font size="14"></font>
<font size="15></font>
HTML;
preg_match_all('/<font\s+size=([\'"]?)(\d+)\1[^>]*>/', $str, $arr);
print_r($arr);
/*
Array
(
    [0] => 12
    [1] => 13
    [2] => 14
)
*/

//部分模式修饰符,模式修饰符也可以放在表达式中的
//这里匹配符合XHTML规范的style里的颜色值,大写的STYLE被忽略了,但是里面的color可以大小写无所谓
$str = '<b style="COLOR:red"></b><b STYLE="color:blue"></b><b style="color:green"></b>';
preg_match_all('/style=([\'"]?)(?i)color:(\w+)\1(?-i)/', $str, $arr);
print_r($arr[2])

//也可以把匹配内容放到里面,用:隔开,就不用写结束(?-i)
//preg_match_all('/style=([\'"]?)(?i:color:(\w+))\1/', $str, $arr);
//再看一例子
$str = '<B>Style</B>';
preg_match('/<B>(?i:style)<\/B>/', $str, $arr);
print_r($arr); //可以匹配到
$str = '<B>Style</b>';
preg_match('/<B>(?i:style)<\/B>/', $str, $arr);
print_r($arr); //什么都没匹配到

//单词检索,可惜只能用在英文
$str = 'I\'m a teacher';
preg_match_all('/\b[a-z]+\b/i', $str, $arr);
print_r($arr)

//u修饰符,按unicode匹配
$str = '你您';
$str = preg_replace('/[你您]/', 'you', $str);
echo $str; //被拆开了,打印4次you

//看下面加上u修饰符后的效果,该修饰符需要编码utf-8否则会报错
//我的文本都是gb2312,所以要转成utf-8
$str = iconv('gb2312', 'utf-8', '你您');
$regex = iconv('gb2312', 'utf-8', '/[你您]/u');
$str = preg_replace($regex, 'you', $str);
echo $str; //打印2次you

//x模式修饰符,可以忽略空白和加注释
$str = 'test Test';
preg_match('/test  #只匹配小写的test/x', $str, $arr);
print_r($arr);

//排除环视(?<!...) (?!...)、忽略优先 *? +? ?? 的复合使用
$str = 'test <B>test1<B> test2</B>';
preg_match('/<B>(?:.(?<!<B>))*<\/B>/i', $str, $arr);
//或者 preg_match('/<B>(?:(?!<B>).)*<\/B>/i', $str, $arr);
print_r($arr)

//当时这样写应付不了 $str = 'test <B>test1<B> test2</B> test3</B>';
//改写一下正则既可 preg_match_all('/<B>(?:(?!<\/?B>).)*<\/B>/i', $str, $arr);
//根据上面来完成一个最简单的UBB替换
$str = 'test [b]test1[b] test2[/b] test3[/b]test';
$str = preg_replace('/\[B\]((?:(?!\[\/?B\]).)*)\[\/B\]/i', '<b>\1</b>', $str);
$str = preg_replace('/\[B\]((?:(?!\[\/?B\]).)*)\[\/B\]/i', '<b>\1</b>', $str);
print_r($str)

//如果已经确认回朔并不会有匹配结果,可以使用固化分组来放弃备用状态提高效率
$str = 'Subject';
preg_match('/(\w+):/', $str, $arr);

//用以下方法代替
//在第一组匹配规则匹配到文本末尾t时匹配结束,启用第二组匹配规则:并不会找到结果,所以这个时候回朔查找,但是\w不会包含:,所以可以直接放弃,
preg_match('/(?>\w+):/', $str, $arr);

(0)

相关推荐

  • 比较实用的正则表达式学习笔记

    //匹配文本,这个偶尔比较好用,但是要小心字符中包含\E $str = '[a-z]'; $str = preg_replace('/\G[a-z]\E/', '', $str); echo $str; //打印空,全被替换掉了,相关大概就是preg_quote功能 //给匹配结果命名,这样在匹配结果中就可以用这个名称来获取值 $str = 'abc123abc'; preg_match('/(?P<num>\d+)/', $str, $arr); echo $arr['num']; //相当

  • 正则表达式学习笔记

    正则表达式学习笔记 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含  有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*  的含义是不同的. 为便于理解和记忆,先从一些概念入手,所有特殊字符或字符组合有一个总表在后面,最后一  些例子供理解相应的概念. 正则表达式 是由普通字符(例如字符 a 到 z)以及特殊字符(

  • js正则表达式学习笔记

    正则表达式:对字符串中的信息实现查找.替换和提取操作.(不支持注释和空白,必须写在一行内) 正则表达式的创建:包含在一对斜杠之间的字符(直接量语法) 例如: var pattern = /s$/; // 创建一个正则来匹配所有以字母s结尾的字符串,并赋值给pattern 一 .字符类 将直接量字符单独放进方括号内就组成了字符类. 一个字符类可以匹配它所包含的任意字符. 正则表达式的字符类: [...]      方括号内的任意字符 [^...]    不在方括号内的任意字符 .         

  • php正则表达式学习笔记

    php正则表达式学习笔记分享: 1.创建正则表达式 $regex = '/\d/i'; 与JavaScript中的第一个方式有点像,只是这里的话是个字符串.  2.正则表达式中的特殊字符 特殊字符有:   . \ + * ? [ ^ ] $ ( ) { } = ! < > | : - 3.正则表达式中的函数 有8个方法,preg_match与preg_match_all,preg_replace与preg_replace_callback,preg_grep.preg_split.preg_l

  • Java中@Pattern注解常用的校验正则表达式学习笔记

    目录 1. 前端传参要求 2.其他常用正则表达式 2.1 数字校验 2.2 字符串校验 2.3 月份时间校验 2.4 Email校验 2.5 汉字校验 2.5 联系电话校验 2.5 密码校验 总结 1. 前端传参要求 项目开发中经常会遇到对用户输入内容的限制,本篇对常用限制做一总结.如下图所示,标识字段有严格命名限制,用户输入校验这部分工作前端可以做,当然后端也可以通过在实体类中添加注解的方式实现参数校验.其底层原理还是拦截器拦截请求,对带有相关注解的属性字段进行处理(非空.大小.长度.内容等判

  • java正则表达式学习笔记之命名捕获

    很多正则引擎都支持命名分组,java是在java7中才引入这个特性,语法与.Net类似(.Net允许同一表达式出现名字相同的分组,java不允许). 命名分组很好理解,就是给分组进行命名.下面简单演示一下java中如何使用以及注意事项. 1.正则中定义名为NAME的分组 (?<NAME>X) 这里X为我们要匹配的内容,注意,在这个命名不能重复,名字也不能以数字开头! 2.反向引用NAME组所匹配到的内容 \k<NAME> 注意,反向引用是针对组所匹配到的内容,而非组的表达式. 3.

  • 又一篇正则表达式学习笔记

    1. \b:表示单词的开头或者结尾,可能是空格.标点符号或者换行,但是\b不匹配其中的任何一个,这是指代这些元素中的任一个位置. 示例:\bhi\b:查找文本中所有的"hi"单词,但是不包括him.history等字样 1.1 ^:匹配字符串的开始,特指一个段落的起始. 1.2 $:匹配字符串的结束.特指一个段落的结尾,这两个都是\b的子集. 重复: 2. *:表示*前面的内容重复出现任意多次,".*"连在一起就表示任意数量的不包含换行符的字符. 示例:\bhi\b

  • Shell正则表达式学习笔记

    正规表示法(或称为常规表示法)是透过一些特殊字符的排列,用以搜寻/取代/删除一列或多列文字字符串, 简单的说,正规表示法就是用在字符串的处理上面的一项『表示式』.正规表示法并不是一个工具程序, 而是一个字符串处理的标准依据,如果您想要以正规表示法的方式处理字符串,就得要使用支持正规表示法的工具程序才行, 这类的工具程序很多,例如 vi, sed, awk 等等. 一.正则表达式是什么? 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作. 二.

  • Python实用库 PrettyTable 学习笔记

    本文实例讲述了Python实用库 PrettyTable.分享给大家供大家参考,具体如下: PrettyTable安装 使用pip即可十分方便的安装PrettyTable,如下: pip install PrettyTable PrettyTable使用示例 github上有PrettyTable的使用说明,链接如下:https://github.com/dprince/python-prettytable 以下是具体的使用示例: import prettytable as pt 按行添加数据

  • js 正则表达式学习笔记之匹配字符串

    今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) 复制代码 代码如下: var str1 = "我是字符串1哦,快把我取走", str2 = "我是字符串2哦,快把我取走"; 比如这样一个字符串,匹配起来很简单 /"[^"]*"/g 即可.   PS: 白色截图是 chrome 34 控制台中

随机推荐