[正则表达式]常用正则表达式实例

1、选中被逗号(或其他符号)分割的字符串当中的某一个值

69,23,69,88,695,69,69,6,765769fd969690,3242,969,69

实例,选中以上字符串所有出现的69部分

(\b69\b[,]?)|([,]?\b69\b)

javascript

var val  = "69";
var exp  = new RegExp("(\\b"+val+"\\b[,]?)|([,]?\\b"+val+"\\b)","g");

php

$matches  =  array();
$search   =  '69,23,69,88,695,69,69,6,765769fd969690,3242,969,69';
$target   =  '69';
$pattern  =  '/(\b'.$target.'\b[,]?)|([,]?\b'.$target.'\b)/';
preg_match_all ($pattern, $search, $matches);

 

2、运用环视功能为数字描点

569836495

实例,从数字的第1位起,每三位插入逗号以区分数位

(?<=\d)(?=(?:[\d]{3})+\b)

 

javascript,由于javascript只支持顺序环视,所以写法会跟其他语言有些区别

var subject = "569836495";
var exp     = /(\d)(?=(\d{3})+(?!\d))/g;
subject.replace(exp, "$1,");

php

$subject  =  '569836495';
$target   =  ',';
$pattern  =  '/(?<=\d)(?=(?:[\d]{3})+\b)/';
preg_replace($pattern, $target, $subject);

 3.匹配引号当中的内容,内容包含转义引号

"([^"]|(?<=\\)")*"

 但是它不支持引号内包含\\"这种形式的字符,因为第一个\是为了转义第二个\,而"事实上是边界来的,但是被上面的表达式识别成了第二个\是为了转义"

 并且有很多引擎(如javascript)不支持逆序环视,好在用顺序环视也是可以表达出来的,只不过在写法上会复杂一些:

"([^"\\]|((?=\\\\)[\\][\\]|(?=\\[^"])[\\]|(?=\\")[\\]["]))*"

 此表达式由"号开始然后匹配正文,正文允许0到n个匹配,最后以"结束

 正文匹配分两部分:

  第一部分当遇到不是"和\字符则直接匹配;

  第二部分当遇到"和\字符时,符合子表达式(?=\\\\)[\\][\\]|(?=\\[^"])[\\]|(?=\\")[\\]["]才匹配;

  子表达式很简单:

   (?=\\\\)[\\][\\]:如果是连续两个\\则匹配;

   (?=\\[^"])[\\]:如果是一个\,并且后接字符不是"则匹配;

   (?=\\")[\\]["]:如果是\"则匹配;

   这个表达式只适合NFA引擎,由于NFA引擎的工作原理,匹配是优先的,只有后面还有匹配规则,并且这个规则匹配不上的时候,前面的匹配才会把结果吐出来进行尝试回溯,

   所以子表达式当中(?=\\\\)[\\][\\]必须要在(?=\\[^"])[\\]前面,动动脑子想想为什么吧;

   4.去除字符串前后字符(trim)

^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$

   这个其实很容易理解,起始位接\s+,或者\s+接结束位都会被匹配;

posted @ 2017-07-18 10:36  yiyide266  阅读(431)  评论(0编辑  收藏  举报